<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/mmzone.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/mmzone.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="Maybe">       1:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX01NWk9ORV9IXzA_"><span class="b">_LINUX_MMZONE_H</span></a>
<a name="2" /><span class="Maybe">       2:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX01NWk9ORV9IXzA_"><span class="b">_LINUX_MMZONE_H</span></a>
<a name="3" /><span class="Maybe">       3:</span> 
<a name="4" /><span class="Maybe">       4:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">__ASSEMBLY__</span>
<a name="5" /><span class="Maybe">       5:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">__GENERATING_BOUNDS_H</span>
<a name="6" /><span class="Maybe">       6:</span> 
<a name="7" /><span class="Maybe">       7:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">spinlock</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="8" /><span class="Maybe">       8:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">list</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="9" /><span class="Maybe">       9:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">wait</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="10" /><span class="Maybe">      10:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">bitops</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="11" /><span class="Maybe">      11:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">cache</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="12" /><span class="Maybe">      12:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">threads</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">numa</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="14" /><span class="Maybe">      14:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">init</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="15" /><span class="Maybe">      15:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">seqlock</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">nodemask</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="17" /><span class="Maybe">      17:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">pageblock</span><span class="f">-</span><span class="b">flags</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="18" /><span class="Maybe">      18:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">page</span><span class="f">-</span><span class="b">flags</span><span class="f">-</span><span class="b">layout</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">atomic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">page</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="21" /><span class="Maybe">      21:</span> 
<a name="22" /><span class="Maybe">      22:</span> <span class="k">/* Free memory management - zoned buddy allocator.  */</span>
<a name="23" /><span class="Maybe">      23:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">CONFIG_FORCE_MAX_ZONEORDER</span>
<a name="24" /><span class="Maybe">      24:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TUFYX09SREVSXzA_"><span class="b">MAX_ORDER</span></a> <span class="c">11</span>
<a name="25" /><span class="False">      25:</span> <span class="f">#</span><span class="n">else</span>
<a name="26" /><span class="False">      26:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TUFYX09SREVSXzA_"><span class="b">MAX_ORDER</span></a> <span class="b">CONFIG_FORCE_MAX_ZONEORDER</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="f">#</span><span class="n">endif</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TUFYX09SREVSX05SX1BBR0VTXzA_"><span class="b">MAX_ORDER_NR_PAGES</span></a> <span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_TUFYX09SREVSXzA_"><span class="b">MAX_ORDER</span></a> <span class="f">-</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="29" /><span class="Maybe">      29:</span> 
<a name="30" /><span class="Maybe">      30:</span> <span class="k">/*</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> * PAGE_ALLOC_COSTLY_ORDER is the order at which allocations are deemed</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="k"> * costly to service.  That is between allocation orders which should</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="k"> * coalesce naturally under reasonable reclaim pressure and those which</span>
<a name="34" /><span class="Maybe">      34:</span> <span class="k"> * will not.</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="k"> */</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UEFHRV9BTExPQ19DT1NUTFlfT1JERVJfMA__"><span class="b">PAGE_ALLOC_COSTLY_ORDER</span></a> <span class="c">3</span>
<a name="37" /><span class="Maybe">      37:</span> 
<a name="38" /><span class="Maybe">      38:</span> <span class="m">enum</span> <span class="f">{</span>
<a name="39" /><span class="Maybe">      39:</span>     <span class="b">MIGRATE_UNMOVABLE</span><span class="f">,</span>
<a name="40" /><span class="Maybe">      40:</span>     <span class="b">MIGRATE_RECLAIMABLE</span><span class="f">,</span>
<a name="41" /><span class="Maybe">      41:</span>     <span class="b">MIGRATE_MOVABLE</span><span class="f">,</span>
<a name="42" /><span class="Maybe">      42:</span>     <span class="b">MIGRATE_PCPTYPES</span><span class="f">,</span>    <span class="k">/* the number of types on the pcp lists */</span>
<a name="43" /><span class="Maybe">      43:</span>     <span class="b">MIGRATE_RESERVE</span> <span class="f">=</span> <span class="b">MIGRATE_PCPTYPES</span><span class="f">,</span>
<a name="44" /><span class="False">      44:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_CMA</span>
<a name="45" /><span class="False">      45:</span>     <span class="k">/*</span>
<a name="46" /><span class="False">      46:</span> <span class="k">     * MIGRATE_CMA migration type is designed to mimic the way</span>
<a name="47" /><span class="False">      47:</span> <span class="k">     * ZONE_MOVABLE works.  Only movable pages can be allocated</span>
<a name="48" /><span class="False">      48:</span> <span class="k">     * from MIGRATE_CMA pageblocks and page allocator never</span>
<a name="49" /><span class="False">      49:</span> <span class="k">     * implicitly change migration type of MIGRATE_CMA pageblock.</span>
<a name="50" /><span class="False">      50:</span> <span class="k">     *</span>
<a name="51" /><span class="False">      51:</span> <span class="k">     * The way to use it is to change migratetype of a range of</span>
<a name="52" /><span class="False">      52:</span> <span class="k">     * pageblocks to MIGRATE_CMA which can be done by</span>
<a name="53" /><span class="False">      53:</span> <span class="k">     * __free_pageblock_cma() function.  What is important though</span>
<a name="54" /><span class="False">      54:</span> <span class="k">     * is that a range of pageblocks must be aligned to</span>
<a name="55" /><span class="False">      55:</span> <span class="k">     * MAX_ORDER_NR_PAGES should biggest page be bigger then</span>
<a name="56" /><span class="False">      56:</span> <span class="k">     * a single pageblock.</span>
<a name="57" /><span class="False">      57:</span> <span class="k">     */</span>
<a name="58" /><span class="False">      58:</span>     <span class="b">MIGRATE_CMA</span><span class="f">,</span>
<a name="59" /><span class="Maybe">      59:</span> <span class="f">#</span><span class="n">endif</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX01FTU9SWV9JU09MQVRJT05fMA__"><span class="b">CONFIG_MEMORY_ISOLATION</span></a>
<a name="61" /><span class="Maybe">      61:</span>     <span class="b">MIGRATE_ISOLATE</span><span class="f">,</span>    <span class="k">/* can&apos;t allocate from here */</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="f">#</span><span class="n">endif</span>
<a name="63" /><span class="Maybe">      63:</span>     <span class="b">MIGRATE_TYPES</span>
<a name="64" /><span class="Maybe">      64:</span> <span class="f">}</span><span class="f">;</span>
<a name="65" /><span class="Maybe">      65:</span> 
<a name="66" /><span class="False">      66:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_CMA</span>
<a name="67" /><span class="False">      67:</span> <span class="f">#</span>  <span class="n">define</span> <a href="cpu.c_macros_ref.html#_aXNfbWlncmF0ZV9jbWFfMA__"><span class="b">is_migrate_cma</span></a><span class="f">(</span><span class="b">migratetype</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="f">(</span><span class="b">migratetype</span><span class="f">)</span> <span class="f">==</span> <span class="b">MIGRATE_CMA</span><span class="f">)</span>
<a name="68" /><span class="Maybe">      68:</span> <span class="f">#</span><span class="n">else</span>
<a name="69" /><span class="Maybe">      69:</span> <span class="f">#</span>  <span class="n">define</span> <a href="cpu.c_macros_ref.html#_aXNfbWlncmF0ZV9jbWFfMA__"><span class="b">is_migrate_cma</span></a><span class="f">(</span><span class="b">migratetype</span><span class="f">)</span> <span class="m">false</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="f">#</span><span class="n">endif</span>
<a name="71" /><span class="Maybe">      71:</span> 
<a name="72" /><span class="Maybe">      72:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfbWlncmF0ZXR5cGVfb3JkZXJfMA__"><span class="b">for_each_migratetype_order</span></a><span class="f">(</span><span class="b">order</span><span class="f">,</span> <span class="b">type</span><span class="f">)</span> \
<a name="73" /><span class="Maybe">      73:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">order</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span> <span class="b">order</span> <span class="f">&lt;</span> <a href="cpu.c_macros_ref.html#_TUFYX09SREVSXzA_"><span class="b">MAX_ORDER</span></a><span class="f">;</span> <span class="b">order</span><span class="f">++</span><span class="f">)</span> \
<a name="74" /><span class="Maybe">      74:</span>         <span class="m">for</span> <span class="f">(</span><span class="b">type</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span> <span class="b">type</span> <span class="f">&lt;</span> <span class="b">MIGRATE_TYPES</span><span class="f">;</span> <span class="b">type</span><span class="f">++</span><span class="f">)</span>
<a name="75" /><span class="Maybe">      75:</span> 
<a name="76" /><span class="Maybe">      76:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">page_group_by_mobility_disabled</span><span class="f">;</span>
<a name="77" /><span class="Maybe">      77:</span> 
<a name="78" /><span class="Maybe">      78:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">get_pageblock_migratetype</span><span class="f">(</span><span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="b">page</span><span class="f">)</span>
<a name="79" /><span class="Maybe">      79:</span> <span class="f">{</span>
<a name="80" /><span class="Maybe">      80:</span>     <span class="m">return</span> <span class="b">get_pageblock_flags_group</span><span class="f">(</span><span class="b">page</span><span class="f">,</span> <span class="b">PB_migrate</span><span class="f">,</span> <span class="b">PB_migrate_end</span><span class="f">)</span><span class="f">;</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="f">}</span>
<a name="82" /><span class="Maybe">      82:</span> 
<a name="83" /><span class="Maybe">      83:</span> <span class="m">struct</span> <span class="b">free_area</span> <span class="f">{</span>
<a name="84" /><span class="Maybe">      84:</span>     <span class="m">struct</span> <span class="b">list_head</span>    <span class="b">free_list</span><span class="f">[</span><span class="b">MIGRATE_TYPES</span><span class="f">]</span><span class="f">;</span>
<a name="85" /><span class="Maybe">      85:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">nr_free</span><span class="f">;</span>
<a name="86" /><span class="Maybe">      86:</span> <span class="f">}</span><span class="f">;</span>
<a name="87" /><span class="Maybe">      87:</span> 
<a name="88" /><span class="Maybe">      88:</span> <span class="m">struct</span> <span class="b">pglist_data</span><span class="f">;</span>
<a name="89" /><span class="Maybe">      89:</span> 
<a name="90" /><span class="Maybe">      90:</span> <span class="k">/*</span>
<a name="91" /><span class="Maybe">      91:</span> <span class="k"> * zone-&gt;lock and zone-&gt;lru_lock are two of the hottest locks in the kernel.</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="k"> * So add a wild amount of padding here to ensure that they fall into separate</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="k"> * cachelines.  There are very few zone structures in the machine, so space</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="k"> * consumption is not a concern here.</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="k"> */</span>
<a name="96" /><span class="Maybe">      96:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a><span class="f">)</span>
<a name="97" /><span class="Maybe">      97:</span> <span class="m">struct</span> <span class="b">zone_padding</span> <span class="f">{</span>
<a name="98" /><span class="Maybe">      98:</span>     <span class="m">char</span> <span class="b">x</span><span class="f">[</span><span class="c">0</span><span class="f">]</span><span class="f">;</span>
<a name="99" /><span class="Maybe">      99:</span> <span class="f">}</span> <a href="cpu.c_macros_ref.html#_X19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcF8w"><span class="b">____cacheline_internodealigned_in_smp</span></a><span class="f">;</span>
<a name="100" /><span class="Maybe">     100:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Wk9ORV9QQURESU5HXzA_"><span class="b">ZONE_PADDING</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>    <span class="m">struct</span> <span class="b">zone_padding</span> <span class="b">name</span><span class="f">;</span>
<a name="101" /><span class="False">     101:</span> <span class="f">#</span><span class="n">else</span>
<a name="102" /><span class="False">     102:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Wk9ORV9QQURESU5HXzA_"><span class="b">ZONE_PADDING</span></a><span class="f">(</span><span class="b">name</span><span class="f">)</span>
<a name="103" /><span class="Maybe">     103:</span> <span class="f">#</span><span class="n">endif</span>
<a name="104" /><span class="Maybe">     104:</span> 
<a name="105" /><span class="Maybe">     105:</span> <span class="m">enum</span> <span class="b">zone_stat_item</span> <span class="f">{</span>
<a name="106" /><span class="Maybe">     106:</span>     <span class="k">/* First 128 byte cacheline (assuming 64 bit words) */</span>
<a name="107" /><span class="Maybe">     107:</span>     <span class="b">NR_FREE_PAGES</span><span class="f">,</span>
<a name="108" /><span class="Maybe">     108:</span>     <span class="b">NR_ALLOC_BATCH</span><span class="f">,</span>
<a name="109" /><span class="Maybe">     109:</span>     <span class="b">NR_LRU_BASE</span><span class="f">,</span>
<a name="110" /><span class="Maybe">     110:</span>     <span class="b">NR_INACTIVE_ANON</span> <span class="f">=</span> <span class="b">NR_LRU_BASE</span><span class="f">,</span> <span class="k">/* must match order of LRU_[IN]ACTIVE */</span>
<a name="111" /><span class="Maybe">     111:</span>     <span class="b">NR_ACTIVE_ANON</span><span class="f">,</span>        <span class="k">/*  &quot;     &quot;     &quot;   &quot;       &quot;         */</span>
<a name="112" /><span class="Maybe">     112:</span>     <span class="b">NR_INACTIVE_FILE</span><span class="f">,</span>    <span class="k">/*  &quot;     &quot;     &quot;   &quot;       &quot;         */</span>
<a name="113" /><span class="Maybe">     113:</span>     <span class="b">NR_ACTIVE_FILE</span><span class="f">,</span>        <span class="k">/*  &quot;     &quot;     &quot;   &quot;       &quot;         */</span>
<a name="114" /><span class="Maybe">     114:</span>     <span class="b">NR_UNEVICTABLE</span><span class="f">,</span>        <span class="k">/*  &quot;     &quot;     &quot;   &quot;       &quot;         */</span>
<a name="115" /><span class="Maybe">     115:</span>     <span class="b">NR_MLOCK</span><span class="f">,</span>        <span class="k">/* mlock()ed pages found and moved off LRU */</span>
<a name="116" /><span class="Maybe">     116:</span>     <span class="b">NR_ANON_PAGES</span><span class="f">,</span>    <span class="k">/* Mapped anonymous pages */</span>
<a name="117" /><span class="Maybe">     117:</span>     <span class="b">NR_FILE_MAPPED</span><span class="f">,</span>    <span class="k">/* pagecache pages mapped into pagetables.</span>
<a name="118" /><span class="Maybe">     118:</span> <span class="k">               only modified from process context */</span>
<a name="119" /><span class="Maybe">     119:</span>     <span class="b">NR_FILE_PAGES</span><span class="f">,</span>
<a name="120" /><span class="Maybe">     120:</span>     <span class="b">NR_FILE_DIRTY</span><span class="f">,</span>
<a name="121" /><span class="Maybe">     121:</span>     <span class="b">NR_WRITEBACK</span><span class="f">,</span>
<a name="122" /><span class="Maybe">     122:</span>     <span class="b">NR_SLAB_RECLAIMABLE</span><span class="f">,</span>
<a name="123" /><span class="Maybe">     123:</span>     <span class="b">NR_SLAB_UNRECLAIMABLE</span><span class="f">,</span>
<a name="124" /><span class="Maybe">     124:</span>     <span class="b">NR_PAGETABLE</span><span class="f">,</span>        <span class="k">/* used for pagetables */</span>
<a name="125" /><span class="Maybe">     125:</span>     <span class="b">NR_KERNEL_STACK</span><span class="f">,</span>
<a name="126" /><span class="Maybe">     126:</span>     <span class="k">/* Second 128 byte cacheline */</span>
<a name="127" /><span class="Maybe">     127:</span>     <span class="b">NR_UNSTABLE_NFS</span><span class="f">,</span>    <span class="k">/* NFS unstable pages */</span>
<a name="128" /><span class="Maybe">     128:</span>     <span class="b">NR_BOUNCE</span><span class="f">,</span>
<a name="129" /><span class="Maybe">     129:</span>     <span class="b">NR_VMSCAN_WRITE</span><span class="f">,</span>
<a name="130" /><span class="Maybe">     130:</span>     <span class="b">NR_VMSCAN_IMMEDIATE</span><span class="f">,</span>    <span class="k">/* Prioritise for reclaim when writeback ends */</span>
<a name="131" /><span class="Maybe">     131:</span>     <span class="b">NR_WRITEBACK_TEMP</span><span class="f">,</span>    <span class="k">/* Writeback using temporary buffers */</span>
<a name="132" /><span class="Maybe">     132:</span>     <span class="b">NR_ISOLATED_ANON</span><span class="f">,</span>    <span class="k">/* Temporary isolated pages from anon lru */</span>
<a name="133" /><span class="Maybe">     133:</span>     <span class="b">NR_ISOLATED_FILE</span><span class="f">,</span>    <span class="k">/* Temporary isolated pages from file lru */</span>
<a name="134" /><span class="Maybe">     134:</span>     <span class="b">NR_SHMEM</span><span class="f">,</span>        <span class="k">/* shmem pages (included tmpfs/GEM pages) */</span>
<a name="135" /><span class="Maybe">     135:</span>     <span class="b">NR_DIRTIED</span><span class="f">,</span>        <span class="k">/* page dirtyings since bootup */</span>
<a name="136" /><span class="Maybe">     136:</span>     <span class="b">NR_WRITTEN</span><span class="f">,</span>        <span class="k">/* page writings since bootup */</span>
<a name="137" /><span class="Maybe">     137:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05VTUFfMA__"><span class="b">CONFIG_NUMA</span></a>
<a name="138" /><span class="Maybe">     138:</span>     <span class="b">NUMA_HIT</span><span class="f">,</span>        <span class="k">/* allocated in intended node */</span>
<a name="139" /><span class="Maybe">     139:</span>     <span class="b">NUMA_MISS</span><span class="f">,</span>        <span class="k">/* allocated in non intended node */</span>
<a name="140" /><span class="Maybe">     140:</span>     <span class="b">NUMA_FOREIGN</span><span class="f">,</span>        <span class="k">/* was intended here, hit elsewhere */</span>
<a name="141" /><span class="Maybe">     141:</span>     <span class="b">NUMA_INTERLEAVE_HIT</span><span class="f">,</span>    <span class="k">/* interleaver preferred this zone */</span>
<a name="142" /><span class="Maybe">     142:</span>     <span class="b">NUMA_LOCAL</span><span class="f">,</span>        <span class="k">/* allocation from local node */</span>
<a name="143" /><span class="Maybe">     143:</span>     <span class="b">NUMA_OTHER</span><span class="f">,</span>        <span class="k">/* allocation from other node */</span>
<a name="144" /><span class="Maybe">     144:</span> <span class="f">#</span><span class="n">endif</span>
<a name="145" /><span class="Maybe">     145:</span>     <span class="b">NR_ANON_TRANSPARENT_HUGEPAGES</span><span class="f">,</span>
<a name="146" /><span class="Maybe">     146:</span>     <span class="b">NR_FREE_CMA_PAGES</span><span class="f">,</span>
<a name="147" /><span class="Maybe">     147:</span>     <span class="b">NR_VM_ZONE_STAT_ITEMS</span> <span class="f">}</span><span class="f">;</span>
<a name="148" /><span class="Maybe">     148:</span> 
<a name="149" /><span class="Maybe">     149:</span> <span class="k">/*</span>
<a name="150" /><span class="Maybe">     150:</span> <span class="k"> * We do arithmetic on the LRU lists in various places in the code,</span>
<a name="151" /><span class="Maybe">     151:</span> <span class="k"> * so it is important to keep the active lists LRU_ACTIVE higher in</span>
<a name="152" /><span class="Maybe">     152:</span> <span class="k"> * the array than the corresponding inactive lists, and to keep</span>
<a name="153" /><span class="Maybe">     153:</span> <span class="k"> * the *_FILE lists LRU_FILE higher than the corresponding _ANON lists.</span>
<a name="154" /><span class="Maybe">     154:</span> <span class="k"> *</span>
<a name="155" /><span class="Maybe">     155:</span> <span class="k"> * This has to be kept in sync with the statistics in zone_stat_item</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="k"> * above and the descriptions in vmstat_text in mm/vmstat.c</span>
<a name="157" /><span class="Maybe">     157:</span> <span class="k"> */</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TFJVX0JBU0VfMA__"><span class="b">LRU_BASE</span></a> <span class="c">0</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TFJVX0FDVElWRV8w"><span class="b">LRU_ACTIVE</span></a> <span class="c">1</span>
<a name="160" /><span class="Maybe">     160:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TFJVX0ZJTEVfMA__"><span class="b">LRU_FILE</span></a> <span class="c">2</span>
<a name="161" /><span class="Maybe">     161:</span> 
<a name="162" /><span class="Maybe">     162:</span> <span class="m">enum</span> <span class="b">lru_list</span> <span class="f">{</span>
<a name="163" /><span class="Maybe">     163:</span>     <span class="b">LRU_INACTIVE_ANON</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TFJVX0JBU0VfMA__"><span class="b">LRU_BASE</span></a><span class="f">,</span>
<a name="164" /><span class="Maybe">     164:</span>     <span class="b">LRU_ACTIVE_ANON</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TFJVX0JBU0VfMA__"><span class="b">LRU_BASE</span></a> <span class="f">+</span> <a href="cpu.c_macros_ref.html#_TFJVX0FDVElWRV8w"><span class="b">LRU_ACTIVE</span></a><span class="f">,</span>
<a name="165" /><span class="Maybe">     165:</span>     <span class="b">LRU_INACTIVE_FILE</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TFJVX0JBU0VfMA__"><span class="b">LRU_BASE</span></a> <span class="f">+</span> <a href="cpu.c_macros_ref.html#_TFJVX0ZJTEVfMA__"><span class="b">LRU_FILE</span></a><span class="f">,</span>
<a name="166" /><span class="Maybe">     166:</span>     <span class="b">LRU_ACTIVE_FILE</span> <span class="f">=</span> <a href="cpu.c_macros_ref.html#_TFJVX0JBU0VfMA__"><span class="b">LRU_BASE</span></a> <span class="f">+</span> <a href="cpu.c_macros_ref.html#_TFJVX0ZJTEVfMA__"><span class="b">LRU_FILE</span></a> <span class="f">+</span> <a href="cpu.c_macros_ref.html#_TFJVX0FDVElWRV8w"><span class="b">LRU_ACTIVE</span></a><span class="f">,</span>
<a name="167" /><span class="Maybe">     167:</span>     <span class="b">LRU_UNEVICTABLE</span><span class="f">,</span>
<a name="168" /><span class="Maybe">     168:</span>     <span class="b">NR_LRU_LISTS</span>
<a name="169" /><span class="Maybe">     169:</span> <span class="f">}</span><span class="f">;</span>
<a name="170" /><span class="Maybe">     170:</span> 
<a name="171" /><span class="Maybe">     171:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfbHJ1XzA_"><span class="b">for_each_lru</span></a><span class="f">(</span><span class="b">lru</span><span class="f">)</span> <span class="m">for</span> <span class="f">(</span><span class="b">lru</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span> <span class="b">lru</span> <span class="f">&lt;</span> <span class="b">NR_LRU_LISTS</span><span class="f">;</span> <span class="b">lru</span><span class="f">++</span><span class="f">)</span>
<a name="172" /><span class="Maybe">     172:</span> 
<a name="173" /><span class="Maybe">     173:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfZXZpY3RhYmxlX2xydV8w"><span class="b">for_each_evictable_lru</span></a><span class="f">(</span><span class="b">lru</span><span class="f">)</span> <span class="m">for</span> <span class="f">(</span><span class="b">lru</span> <span class="f">=</span> <span class="c">0</span><span class="f">;</span> <span class="b">lru</span> <span class="f">&lt;=</span> <span class="b">LRU_ACTIVE_FILE</span><span class="f">;</span> <span class="b">lru</span><span class="f">++</span><span class="f">)</span>
<a name="174" /><span class="Maybe">     174:</span> 
<a name="175" /><span class="Maybe">     175:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">is_file_lru</span><span class="f">(</span><span class="m">enum</span> <span class="b">lru_list</span> <span class="b">lru</span><span class="f">)</span>
<a name="176" /><span class="Maybe">     176:</span> <span class="f">{</span>
<a name="177" /><span class="Maybe">     177:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">lru</span> <span class="f">==</span> <span class="b">LRU_INACTIVE_FILE</span> <span class="f">||</span> <span class="b">lru</span> <span class="f">==</span> <span class="b">LRU_ACTIVE_FILE</span><span class="f">)</span><span class="f">;</span>
<a name="178" /><span class="Maybe">     178:</span> <span class="f">}</span>
<a name="179" /><span class="Maybe">     179:</span> 
<a name="180" /><span class="Maybe">     180:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">is_active_lru</span><span class="f">(</span><span class="m">enum</span> <span class="b">lru_list</span> <span class="b">lru</span><span class="f">)</span>
<a name="181" /><span class="Maybe">     181:</span> <span class="f">{</span>
<a name="182" /><span class="Maybe">     182:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">lru</span> <span class="f">==</span> <span class="b">LRU_ACTIVE_ANON</span> <span class="f">||</span> <span class="b">lru</span> <span class="f">==</span> <span class="b">LRU_ACTIVE_FILE</span><span class="f">)</span><span class="f">;</span>
<a name="183" /><span class="Maybe">     183:</span> <span class="f">}</span>
<a name="184" /><span class="Maybe">     184:</span> 
<a name="185" /><span class="Maybe">     185:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">is_unevictable_lru</span><span class="f">(</span><span class="m">enum</span> <span class="b">lru_list</span> <span class="b">lru</span><span class="f">)</span>
<a name="186" /><span class="Maybe">     186:</span> <span class="f">{</span>
<a name="187" /><span class="Maybe">     187:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">lru</span> <span class="f">==</span> <span class="b">LRU_UNEVICTABLE</span><span class="f">)</span><span class="f">;</span>
<a name="188" /><span class="Maybe">     188:</span> <span class="f">}</span>
<a name="189" /><span class="Maybe">     189:</span> 
<a name="190" /><span class="Maybe">     190:</span> <span class="m">struct</span> <span class="b">zone_reclaim_stat</span> <span class="f">{</span>
<a name="191" /><span class="Maybe">     191:</span>     <span class="k">/*</span>
<a name="192" /><span class="Maybe">     192:</span> <span class="k">     * The pageout code in vmscan.c keeps track of how many of the</span>
<a name="193" /><span class="Maybe">     193:</span> <span class="k">     * mem/swap backed and file backed pages are referenced.</span>
<a name="194" /><span class="Maybe">     194:</span> <span class="k">     * The higher the rotated/scanned ratio, the more valuable</span>
<a name="195" /><span class="Maybe">     195:</span> <span class="k">     * that cache is.</span>
<a name="196" /><span class="Maybe">     196:</span> <span class="k">     *</span>
<a name="197" /><span class="Maybe">     197:</span> <span class="k">     * The anon LRU stats live in [0], file LRU stats in [1]</span>
<a name="198" /><span class="Maybe">     198:</span> <span class="k">     */</span>
<a name="199" /><span class="Maybe">     199:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">recent_rotated</span><span class="f">[</span><span class="c">2</span><span class="f">]</span><span class="f">;</span>
<a name="200" /><span class="Maybe">     200:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">recent_scanned</span><span class="f">[</span><span class="c">2</span><span class="f">]</span><span class="f">;</span>
<a name="201" /><span class="Maybe">     201:</span> <span class="f">}</span><span class="f">;</span>
<a name="202" /><span class="Maybe">     202:</span> 
<a name="203" /><span class="Maybe">     203:</span> <span class="m">struct</span> <span class="b">lruvec</span> <span class="f">{</span>
<a name="204" /><span class="Maybe">     204:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">lists</span><span class="f">[</span><span class="b">NR_LRU_LISTS</span><span class="f">]</span><span class="f">;</span>
<a name="205" /><span class="Maybe">     205:</span>     <span class="m">struct</span> <span class="b">zone_reclaim_stat</span> <span class="b">reclaim_stat</span><span class="f">;</span>
<a name="206" /><span class="False">     206:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_MEMCG</span>
<a name="207" /><span class="False">     207:</span>     <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">;</span>
<a name="208" /><span class="Maybe">     208:</span> <span class="f">#</span><span class="n">endif</span>
<a name="209" /><span class="Maybe">     209:</span> <span class="f">}</span><span class="f">;</span>
<a name="210" /><span class="Maybe">     210:</span> 
<a name="211" /><span class="Maybe">     211:</span> <span class="k">/* Mask used at gathering information at once (see memcontrol.c) */</span>
<a name="212" /><span class="Maybe">     212:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TFJVX0FMTF9GSUxFXzA_"><span class="b">LRU_ALL_FILE</span></a> <span class="f">(</span><a href="cpu.c_macros_noref.html#_QklUXzA_"><span class="b">BIT</span></a><span class="f">(</span><span class="b">LRU_INACTIVE_FILE</span><span class="f">)</span> <span class="f">|</span> <a href="cpu.c_macros_noref.html#_QklUXzA_"><span class="b">BIT</span></a><span class="f">(</span><span class="b">LRU_ACTIVE_FILE</span><span class="f">)</span><span class="f">)</span>
<a name="213" /><span class="Maybe">     213:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TFJVX0FMTF9BTk9OXzA_"><span class="b">LRU_ALL_ANON</span></a> <span class="f">(</span><a href="cpu.c_macros_noref.html#_QklUXzA_"><span class="b">BIT</span></a><span class="f">(</span><span class="b">LRU_INACTIVE_ANON</span><span class="f">)</span> <span class="f">|</span> <a href="cpu.c_macros_noref.html#_QklUXzA_"><span class="b">BIT</span></a><span class="f">(</span><span class="b">LRU_ACTIVE_ANON</span><span class="f">)</span><span class="f">)</span>
<a name="214" /><span class="Maybe">     214:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TFJVX0FMTF8w"><span class="b">LRU_ALL</span></a>         <span class="f">(</span><span class="f">(</span><span class="c">1</span> <span class="f">&lt;&lt;</span> <span class="b">NR_LRU_LISTS</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span>
<a name="215" /><span class="Maybe">     215:</span> 
<a name="216" /><span class="Maybe">     216:</span> <span class="k">/* Isolate clean file */</span>
<a name="217" /><span class="Maybe">     217:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SVNPTEFURV9DTEVBTl8w"><span class="b">ISOLATE_CLEAN</span></a>        <span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_X19mb3JjZV8w"><span class="b">__force</span></a> <span class="b">isolate_mode_t</span><span class="f">)</span><span class="c">0x1</span><span class="f">)</span>
<a name="218" /><span class="Maybe">     218:</span> <span class="k">/* Isolate unmapped file */</span>
<a name="219" /><span class="Maybe">     219:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SVNPTEFURV9VTk1BUFBFRF8w"><span class="b">ISOLATE_UNMAPPED</span></a>    <span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_X19mb3JjZV8w"><span class="b">__force</span></a> <span class="b">isolate_mode_t</span><span class="f">)</span><span class="c">0x2</span><span class="f">)</span>
<a name="220" /><span class="Maybe">     220:</span> <span class="k">/* Isolate for asynchronous migration */</span>
<a name="221" /><span class="Maybe">     221:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SVNPTEFURV9BU1lOQ19NSUdSQVRFXzA_"><span class="b">ISOLATE_ASYNC_MIGRATE</span></a>    <span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_X19mb3JjZV8w"><span class="b">__force</span></a> <span class="b">isolate_mode_t</span><span class="f">)</span><span class="c">0x4</span><span class="f">)</span>
<a name="222" /><span class="Maybe">     222:</span> <span class="k">/* Isolate unevictable pages */</span>
<a name="223" /><span class="Maybe">     223:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_SVNPTEFURV9VTkVWSUNUQUJMRV8w"><span class="b">ISOLATE_UNEVICTABLE</span></a>    <span class="f">(</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_X19mb3JjZV8w"><span class="b">__force</span></a> <span class="b">isolate_mode_t</span><span class="f">)</span><span class="c">0x8</span><span class="f">)</span>
<a name="224" /><span class="Maybe">     224:</span> 
<a name="225" /><span class="Maybe">     225:</span> <span class="k">/* LRU Isolation modes. */</span>
<a name="226" /><span class="Maybe">     226:</span> <span class="m">typedef</span> <span class="m">unsigned</span> <a href="cpu.c_macros_ref.html#_X19iaXR3aXNlX19fMA__"><span class="b">__bitwise__</span></a> <span class="b">isolate_mode_t</span><span class="f">;</span>
<a name="227" /><span class="Maybe">     227:</span> 
<a name="228" /><span class="Maybe">     228:</span> <span class="m">enum</span> <span class="b">zone_watermarks</span> <span class="f">{</span>
<a name="229" /><span class="Maybe">     229:</span>     <span class="b">WMARK_MIN</span><span class="f">,</span>
<a name="230" /><span class="Maybe">     230:</span>     <span class="b">WMARK_LOW</span><span class="f">,</span>
<a name="231" /><span class="Maybe">     231:</span>     <span class="b">WMARK_HIGH</span><span class="f">,</span>
<a name="232" /><span class="Maybe">     232:</span>     <span class="b">NR_WMARK</span>
<a name="233" /><span class="Maybe">     233:</span> <span class="f">}</span><span class="f">;</span>
<a name="234" /><span class="Maybe">     234:</span> 
<a name="235" /><span class="Maybe">     235:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_bWluX3dtYXJrX3BhZ2VzXzA_"><span class="b">min_wmark_pages</span></a><span class="f">(</span><span class="b">z</span><span class="f">)</span> <span class="f">(</span><span class="b">z</span><span class="f">-&gt;</span><span class="b">watermark</span><span class="f">[</span><span class="b">WMARK_MIN</span><span class="f">]</span><span class="f">)</span>
<a name="236" /><span class="Maybe">     236:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_bG93X3dtYXJrX3BhZ2VzXzA_"><span class="b">low_wmark_pages</span></a><span class="f">(</span><span class="b">z</span><span class="f">)</span> <span class="f">(</span><span class="b">z</span><span class="f">-&gt;</span><span class="b">watermark</span><span class="f">[</span><span class="b">WMARK_LOW</span><span class="f">]</span><span class="f">)</span>
<a name="237" /><span class="Maybe">     237:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_aGlnaF93bWFya19wYWdlc18w"><span class="b">high_wmark_pages</span></a><span class="f">(</span><span class="b">z</span><span class="f">)</span> <span class="f">(</span><span class="b">z</span><span class="f">-&gt;</span><span class="b">watermark</span><span class="f">[</span><span class="b">WMARK_HIGH</span><span class="f">]</span><span class="f">)</span>
<a name="238" /><span class="Maybe">     238:</span> 
<a name="239" /><span class="Maybe">     239:</span> <span class="m">struct</span> <span class="b">per_cpu_pages</span> <span class="f">{</span>
<a name="240" /><span class="Maybe">     240:</span>     <span class="m">int</span> <span class="b">count</span><span class="f">;</span>        <span class="k">/* number of pages in the list */</span>
<a name="241" /><span class="Maybe">     241:</span>     <span class="m">int</span> <span class="b">high</span><span class="f">;</span>        <span class="k">/* high watermark, emptying needed */</span>
<a name="242" /><span class="Maybe">     242:</span>     <span class="m">int</span> <span class="b">batch</span><span class="f">;</span>        <span class="k">/* chunk size for buddy add/remove */</span>
<a name="243" /><span class="Maybe">     243:</span> 
<a name="244" /><span class="Maybe">     244:</span>     <span class="k">/* Lists of pages, one per migrate type stored on the pcp-lists */</span>
<a name="245" /><span class="Maybe">     245:</span>     <span class="m">struct</span> <span class="b">list_head</span> <span class="b">lists</span><span class="f">[</span><span class="b">MIGRATE_PCPTYPES</span><span class="f">]</span><span class="f">;</span>
<a name="246" /><span class="Maybe">     246:</span> <span class="f">}</span><span class="f">;</span>
<a name="247" /><span class="Maybe">     247:</span> 
<a name="248" /><span class="Maybe">     248:</span> <span class="m">struct</span> <span class="b">per_cpu_pageset</span> <span class="f">{</span>
<a name="249" /><span class="Maybe">     249:</span>     <span class="m">struct</span> <span class="b">per_cpu_pages</span> <span class="b">pcp</span><span class="f">;</span>
<a name="250" /><span class="Maybe">     250:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05VTUFfMA__"><span class="b">CONFIG_NUMA</span></a>
<a name="251" /><span class="Maybe">     251:</span>     <span class="b">s8</span> <span class="b">expire</span><span class="f">;</span>
<a name="252" /><span class="Maybe">     252:</span> <span class="f">#</span><span class="n">endif</span>
<a name="253" /><span class="Maybe">     253:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NNUF8w"><span class="b">CONFIG_SMP</span></a>
<a name="254" /><span class="Maybe">     254:</span>     <span class="b">s8</span> <span class="b">stat_threshold</span><span class="f">;</span>
<a name="255" /><span class="Maybe">     255:</span>     <span class="b">s8</span> <span class="b">vm_stat_diff</span><span class="f">[</span><span class="b">NR_VM_ZONE_STAT_ITEMS</span><span class="f">]</span><span class="f">;</span>
<a name="256" /><span class="Maybe">     256:</span> <span class="f">#</span><span class="n">endif</span>
<a name="257" /><span class="Maybe">     257:</span> <span class="f">}</span><span class="f">;</span>
<a name="258" /><span class="Maybe">     258:</span> 
<a name="259" /><span class="Maybe">     259:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !__GENERATING_BOUNDS.H */</span>
<a name="260" /><span class="Maybe">     260:</span> 
<a name="261" /><span class="Maybe">     261:</span> <span class="m">enum</span> <span class="b">zone_type</span> <span class="f">{</span>
<a name="262" /><span class="Maybe">     262:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1pPTkVfRE1BXzA_"><span class="b">CONFIG_ZONE_DMA</span></a>
<a name="263" /><span class="Maybe">     263:</span>     <span class="k">/*</span>
<a name="264" /><span class="Maybe">     264:</span> <span class="k">     * ZONE_DMA is used when there are devices that are not able</span>
<a name="265" /><span class="Maybe">     265:</span> <span class="k">     * to do DMA to all of addressable memory (ZONE_NORMAL). Then we</span>
<a name="266" /><span class="Maybe">     266:</span> <span class="k">     * carve out the portion of memory that is needed for these devices.</span>
<a name="267" /><span class="Maybe">     267:</span> <span class="k">     * The range is arch specific.</span>
<a name="268" /><span class="Maybe">     268:</span> <span class="k">     *</span>
<a name="269" /><span class="Maybe">     269:</span> <span class="k">     * Some examples</span>
<a name="270" /><span class="Maybe">     270:</span> <span class="k">     *</span>
<a name="271" /><span class="Maybe">     271:</span> <span class="k">     * Architecture        Limit</span>
<a name="272" /><span class="Maybe">     272:</span> <span class="k">     * ---------------------------</span>
<a name="273" /><span class="Maybe">     273:</span> <span class="k">     * parisc, ia64, sparc    &lt;4G</span>
<a name="274" /><span class="Maybe">     274:</span> <span class="k">     * s390            &lt;2G</span>
<a name="275" /><span class="Maybe">     275:</span> <span class="k">     * arm            Various</span>
<a name="276" /><span class="Maybe">     276:</span> <span class="k">     * alpha        Unlimited or 0-16MB.</span>
<a name="277" /><span class="Maybe">     277:</span> <span class="k">     *</span>
<a name="278" /><span class="Maybe">     278:</span> <span class="k">     * i386, x86_64 and multiple other arches</span>
<a name="279" /><span class="Maybe">     279:</span> <span class="k">     *             &lt;16M.</span>
<a name="280" /><span class="Maybe">     280:</span> <span class="k">     */</span>
<a name="281" /><span class="Maybe">     281:</span>     <span class="b">ZONE_DMA</span><span class="f">,</span>
<a name="282" /><span class="Maybe">     282:</span> <span class="f">#</span><span class="n">endif</span>
<a name="283" /><span class="Maybe">     283:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1pPTkVfRE1BMzJfMA__"><span class="b">CONFIG_ZONE_DMA32</span></a>
<a name="284" /><span class="Maybe">     284:</span>     <span class="k">/*</span>
<a name="285" /><span class="Maybe">     285:</span> <span class="k">     * x86_64 needs two ZONE_DMAs because it supports devices that are</span>
<a name="286" /><span class="Maybe">     286:</span> <span class="k">     * only able to do DMA to the lower 16M but also 32 bit devices that</span>
<a name="287" /><span class="Maybe">     287:</span> <span class="k">     * can only do DMA areas below 4G.</span>
<a name="288" /><span class="Maybe">     288:</span> <span class="k">     */</span>
<a name="289" /><span class="Maybe">     289:</span>     <span class="b">ZONE_DMA32</span><span class="f">,</span>
<a name="290" /><span class="Maybe">     290:</span> <span class="f">#</span><span class="n">endif</span>
<a name="291" /><span class="Maybe">     291:</span>     <span class="k">/*</span>
<a name="292" /><span class="Maybe">     292:</span> <span class="k">     * Normal addressable memory is in ZONE_NORMAL. DMA operations can be</span>
<a name="293" /><span class="Maybe">     293:</span> <span class="k">     * performed on pages in ZONE_NORMAL if the DMA devices support</span>
<a name="294" /><span class="Maybe">     294:</span> <span class="k">     * transfers to all addressable memory.</span>
<a name="295" /><span class="Maybe">     295:</span> <span class="k">     */</span>
<a name="296" /><span class="Maybe">     296:</span>     <span class="b">ZONE_NORMAL</span><span class="f">,</span>
<a name="297" /><span class="False">     297:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_HIGHMEM</span>
<a name="298" /><span class="False">     298:</span>     <span class="k">/*</span>
<a name="299" /><span class="False">     299:</span> <span class="k">     * A memory area that is only addressable by the kernel through</span>
<a name="300" /><span class="False">     300:</span> <span class="k">     * mapping portions into its own address space. This is for example</span>
<a name="301" /><span class="False">     301:</span> <span class="k">     * used by i386 to allow the kernel to address the memory beyond</span>
<a name="302" /><span class="False">     302:</span> <span class="k">     * 900MB. The kernel will set up special mappings (page</span>
<a name="303" /><span class="False">     303:</span> <span class="k">     * table entries on i386) for each page that the kernel needs to</span>
<a name="304" /><span class="False">     304:</span> <span class="k">     * access.</span>
<a name="305" /><span class="False">     305:</span> <span class="k">     */</span>
<a name="306" /><span class="False">     306:</span>     <span class="b">ZONE_HIGHMEM</span><span class="f">,</span>
<a name="307" /><span class="Maybe">     307:</span> <span class="f">#</span><span class="n">endif</span>
<a name="308" /><span class="Maybe">     308:</span>     <span class="b">ZONE_MOVABLE</span><span class="f">,</span>
<a name="309" /><span class="Maybe">     309:</span>     <span class="b">__MAX_NR_ZONES</span>
<a name="310" /><span class="Maybe">     310:</span> <span class="f">}</span><span class="f">;</span>
<a name="311" /><span class="Maybe">     311:</span> 
<a name="312" /><span class="Maybe">     312:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">__GENERATING_BOUNDS_H</span>
<a name="313" /><span class="Maybe">     313:</span> 
<a name="314" /><span class="Maybe">     314:</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">{</span>
<a name="315" /><span class="Maybe">     315:</span>     <span class="k">/* Fields commonly accessed by the page allocator */</span>
<a name="316" /><span class="Maybe">     316:</span> 
<a name="317" /><span class="Maybe">     317:</span>     <span class="k">/* zone watermarks, access with *_wmark_pages(zone) macros */</span>
<a name="318" /><span class="Maybe">     318:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">watermark</span><span class="f">[</span><span class="b">NR_WMARK</span><span class="f">]</span><span class="f">;</span>
<a name="319" /><span class="Maybe">     319:</span> 
<a name="320" /><span class="Maybe">     320:</span>     <span class="k">/*</span>
<a name="321" /><span class="Maybe">     321:</span> <span class="k">     * When free pages are below this point, additional steps are taken</span>
<a name="322" /><span class="Maybe">     322:</span> <span class="k">     * when reading the number of free pages to avoid per-cpu counter</span>
<a name="323" /><span class="Maybe">     323:</span> <span class="k">     * drift allowing watermarks to be breached</span>
<a name="324" /><span class="Maybe">     324:</span> <span class="k">     */</span>
<a name="325" /><span class="Maybe">     325:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">percpu_drift_mark</span><span class="f">;</span>
<a name="326" /><span class="Maybe">     326:</span> 
<a name="327" /><span class="Maybe">     327:</span>     <span class="k">/*</span>
<a name="328" /><span class="Maybe">     328:</span> <span class="k">     * We don&apos;t know if the memory that we&apos;re going to allocate will be freeable</span>
<a name="329" /><span class="Maybe">     329:</span> <span class="k">     * or/and it will be released eventually, so to avoid totally wasting several</span>
<a name="330" /><span class="Maybe">     330:</span> <span class="k">     * GB of ram we must reserve some of the lower zone memory (otherwise we risk</span>
<a name="331" /><span class="Maybe">     331:</span> <span class="k">     * to run OOM on the lower zones despite there&apos;s tons of freeable ram</span>
<a name="332" /><span class="Maybe">     332:</span> <span class="k">     * on the higher zones). This array is recalculated at runtime if the</span>
<a name="333" /><span class="Maybe">     333:</span> <span class="k">     * sysctl_lowmem_reserve_ratio sysctl changes.</span>
<a name="334" /><span class="Maybe">     334:</span> <span class="k">     */</span>
<a name="335" /><span class="Maybe">     335:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">lowmem_reserve</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX05SX1pPTkVTXzA_"><span class="b">MAX_NR_ZONES</span></a><span class="f">]</span><span class="f">;</span>
<a name="336" /><span class="Maybe">     336:</span> 
<a name="337" /><span class="Maybe">     337:</span>     <span class="k">/*</span>
<a name="338" /><span class="Maybe">     338:</span> <span class="k">     * This is a per-zone reserve of pages that should not be</span>
<a name="339" /><span class="Maybe">     339:</span> <span class="k">     * considered dirtyable memory.</span>
<a name="340" /><span class="Maybe">     340:</span> <span class="k">     */</span>
<a name="341" /><span class="Maybe">     341:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">dirty_balance_reserve</span><span class="f">;</span>
<a name="342" /><span class="Maybe">     342:</span> 
<a name="343" /><span class="Maybe">     343:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05VTUFfMA__"><span class="b">CONFIG_NUMA</span></a>
<a name="344" /><span class="Maybe">     344:</span>     <span class="m">int</span> <span class="b">node</span><span class="f">;</span>
<a name="345" /><span class="Maybe">     345:</span>     <span class="k">/*</span>
<a name="346" /><span class="Maybe">     346:</span> <span class="k">     * zone reclaim becomes active if more unmapped pages exist.</span>
<a name="347" /><span class="Maybe">     347:</span> <span class="k">     */</span>
<a name="348" /><span class="Maybe">     348:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">min_unmapped_pages</span><span class="f">;</span>
<a name="349" /><span class="Maybe">     349:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">min_slab_pages</span><span class="f">;</span>
<a name="350" /><span class="Maybe">     350:</span> <span class="f">#</span><span class="n">endif</span>
<a name="351" /><span class="Maybe">     351:</span>     <span class="m">struct</span> <span class="b">per_cpu_pageset</span> <a href="cpu.c_macros_ref.html#_X19wZXJjcHVfMA__"><span class="b">__percpu</span></a> <span class="f">*</span><span class="b">pageset</span><span class="f">;</span>
<a name="352" /><span class="Maybe">     352:</span>     <span class="k">/*</span>
<a name="353" /><span class="Maybe">     353:</span> <span class="k">     * free areas of different sizes</span>
<a name="354" /><span class="Maybe">     354:</span> <span class="k">     */</span>
<a name="355" /><span class="Maybe">     355:</span>     <span class="b">spinlock_t</span>        <span class="b">lock</span><span class="f">;</span>
<a name="356" /><span class="False">     356:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span> <span class="b">CONFIG_COMPACTION</span> <span class="f">||</span> <span class="b">defined</span> <span class="b">CONFIG_CMA</span>
<a name="357" /><span class="False">     357:</span>     <span class="k">/* Set to true when the PG_migrate_skip bits should be cleared */</span>
<a name="358" /><span class="False">     358:</span>     <span class="m">bool</span>            <span class="b">compact_blockskip_flush</span><span class="f">;</span>
<a name="359" /><span class="False">     359:</span> 
<a name="360" /><span class="False">     360:</span>     <span class="k">/* pfns where compaction scanners should start */</span>
<a name="361" /><span class="False">     361:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">compact_cached_free_pfn</span><span class="f">;</span>
<a name="362" /><span class="False">     362:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">compact_cached_migrate_pfn</span><span class="f">;</span>
<a name="363" /><span class="Maybe">     363:</span> <span class="f">#</span><span class="n">endif</span>
<a name="364" /><span class="False">     364:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_MEMORY_HOTPLUG</span>
<a name="365" /><span class="False">     365:</span>     <span class="k">/* see spanned/present_pages for more description */</span>
<a name="366" /><span class="False">     366:</span>     <span class="b">seqlock_t</span>        <span class="b">span_seqlock</span><span class="f">;</span>
<a name="367" /><span class="Maybe">     367:</span> <span class="f">#</span><span class="n">endif</span>
<a name="368" /><span class="Maybe">     368:</span>     <span class="m">struct</span> <span class="b">free_area</span>    <span class="b">free_area</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX09SREVSXzA_"><span class="b">MAX_ORDER</span></a><span class="f">]</span><span class="f">;</span>
<a name="369" /><span class="Maybe">     369:</span> 
<a name="370" /><span class="False">     370:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NQQVJTRU1FTV8w"><span class="b">CONFIG_SPARSEMEM</span></a>
<a name="371" /><span class="False">     371:</span>     <span class="k">/*</span>
<a name="372" /><span class="False">     372:</span> <span class="k">     * Flags for a pageblock_nr_pages block. See pageblock-flags.h.</span>
<a name="373" /><span class="False">     373:</span> <span class="k">     * In SPARSEMEM, this map is stored in struct mem_section</span>
<a name="374" /><span class="False">     374:</span> <span class="k">     */</span>
<a name="375" /><span class="False">     375:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="f">*</span><span class="b">pageblock_flags</span><span class="f">;</span>
<a name="376" /><span class="Maybe">     376:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_SPARSEMEM */</span>
<a name="377" /><span class="Maybe">     377:</span> 
<a name="378" /><span class="False">     378:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_COMPACTION</span>
<a name="379" /><span class="False">     379:</span>     <span class="k">/*</span>
<a name="380" /><span class="False">     380:</span> <span class="k">     * On compaction failure, 1&lt;&lt;compact_defer_shift compactions</span>
<a name="381" /><span class="False">     381:</span> <span class="k">     * are skipped before trying again. The number attempted since</span>
<a name="382" /><span class="False">     382:</span> <span class="k">     * last failure is tracked with compact_considered.</span>
<a name="383" /><span class="False">     383:</span> <span class="k">     */</span>
<a name="384" /><span class="False">     384:</span>     <span class="m">unsigned</span> <span class="m">int</span>        <span class="b">compact_considered</span><span class="f">;</span>
<a name="385" /><span class="False">     385:</span>     <span class="m">unsigned</span> <span class="m">int</span>        <span class="b">compact_defer_shift</span><span class="f">;</span>
<a name="386" /><span class="False">     386:</span>     <span class="m">int</span>            <span class="b">compact_order_failed</span><span class="f">;</span>
<a name="387" /><span class="Maybe">     387:</span> <span class="f">#</span><span class="n">endif</span>
<a name="388" /><span class="Maybe">     388:</span> 
<a name="389" /><span class="Maybe">     389:</span>     <a href="cpu.c_macros_ref.html#_Wk9ORV9QQURESU5HXzA_"><span class="b">ZONE_PADDING</span></a><span class="f">(</span><span class="b">_pad1_</span><span class="f">)</span>
<a name="390" /><span class="Maybe">     390:</span> 
<a name="391" /><span class="Maybe">     391:</span>     <span class="k">/* Fields commonly accessed by the page reclaim scanner */</span>
<a name="392" /><span class="Maybe">     392:</span>     <span class="b">spinlock_t</span>        <span class="b">lru_lock</span><span class="f">;</span>
<a name="393" /><span class="Maybe">     393:</span>     <span class="m">struct</span> <span class="b">lruvec</span>        <span class="b">lruvec</span><span class="f">;</span>
<a name="394" /><span class="Maybe">     394:</span> 
<a name="395" /><span class="Maybe">     395:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">pages_scanned</span><span class="f">;</span>       <span class="k">/* since last reclaim */</span>
<a name="396" /><span class="Maybe">     396:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">flags</span><span class="f">;</span>           <span class="k">/* zone flags, see below */</span>
<a name="397" /><span class="Maybe">     397:</span> 
<a name="398" /><span class="Maybe">     398:</span>     <span class="k">/* Zone statistics */</span>
<a name="399" /><span class="Maybe">     399:</span>     <span class="b">atomic_long_t</span>        <span class="b">vm_stat</span><span class="f">[</span><span class="b">NR_VM_ZONE_STAT_ITEMS</span><span class="f">]</span><span class="f">;</span>
<a name="400" /><span class="Maybe">     400:</span> 
<a name="401" /><span class="Maybe">     401:</span>     <span class="k">/*</span>
<a name="402" /><span class="Maybe">     402:</span> <span class="k">     * The target ratio of ACTIVE_ANON to INACTIVE_ANON pages on</span>
<a name="403" /><span class="Maybe">     403:</span> <span class="k">     * this zone&apos;s LRU.  Maintained by the pageout code.</span>
<a name="404" /><span class="Maybe">     404:</span> <span class="k">     */</span>
<a name="405" /><span class="Maybe">     405:</span>     <span class="m">unsigned</span> <span class="m">int</span> <span class="b">inactive_ratio</span><span class="f">;</span>
<a name="406" /><span class="Maybe">     406:</span> 
<a name="407" /><span class="Maybe">     407:</span> 
<a name="408" /><span class="Maybe">     408:</span>     <a href="cpu.c_macros_ref.html#_Wk9ORV9QQURESU5HXzA_"><span class="b">ZONE_PADDING</span></a><span class="f">(</span><span class="b">_pad2_</span><span class="f">)</span>
<a name="409" /><span class="Maybe">     409:</span>     <span class="k">/* Rarely used or read-mostly fields */</span>
<a name="410" /><span class="Maybe">     410:</span> 
<a name="411" /><span class="Maybe">     411:</span>     <span class="k">/*</span>
<a name="412" /><span class="Maybe">     412:</span> <span class="k">     * wait_table        -- the array holding the hash table</span>
<a name="413" /><span class="Maybe">     413:</span> <span class="k">     * wait_table_hash_nr_entries    -- the size of the hash table array</span>
<a name="414" /><span class="Maybe">     414:</span> <span class="k">     * wait_table_bits    -- wait_table_size == (1 &lt;&lt; wait_table_bits)</span>
<a name="415" /><span class="Maybe">     415:</span> <span class="k">     *</span>
<a name="416" /><span class="Maybe">     416:</span> <span class="k">     * The purpose of all these is to keep track of the people</span>
<a name="417" /><span class="Maybe">     417:</span> <span class="k">     * waiting for a page to become available and make them</span>
<a name="418" /><span class="Maybe">     418:</span> <span class="k">     * runnable again when possible. The trouble is that this</span>
<a name="419" /><span class="Maybe">     419:</span> <span class="k">     * consumes a lot of space, especially when so few things</span>
<a name="420" /><span class="Maybe">     420:</span> <span class="k">     * wait on pages at a given time. So instead of using</span>
<a name="421" /><span class="Maybe">     421:</span> <span class="k">     * per-page waitqueues, we use a waitqueue hash table.</span>
<a name="422" /><span class="Maybe">     422:</span> <span class="k">     *</span>
<a name="423" /><span class="Maybe">     423:</span> <span class="k">     * The bucket discipline is to sleep on the same queue when</span>
<a name="424" /><span class="Maybe">     424:</span> <span class="k">     * colliding and wake all in that wait queue when removing.</span>
<a name="425" /><span class="Maybe">     425:</span> <span class="k">     * When something wakes, it must check to be sure its page is</span>
<a name="426" /><span class="Maybe">     426:</span> <span class="k">     * truly available, a la thundering herd. The cost of a</span>
<a name="427" /><span class="Maybe">     427:</span> <span class="k">     * collision is great, but given the expected load of the</span>
<a name="428" /><span class="Maybe">     428:</span> <span class="k">     * table, they should be so rare as to be outweighed by the</span>
<a name="429" /><span class="Maybe">     429:</span> <span class="k">     * benefits from the saved space.</span>
<a name="430" /><span class="Maybe">     430:</span> <span class="k">     *</span>
<a name="431" /><span class="Maybe">     431:</span> <span class="k">     * __wait_on_page_locked() and unlock_page() in mm/filemap.c, are the</span>
<a name="432" /><span class="Maybe">     432:</span> <span class="k">     * primary users of these fields, and in mm/page_alloc.c</span>
<a name="433" /><span class="Maybe">     433:</span> <span class="k">     * free_area_init_core() performs the initialization of them.</span>
<a name="434" /><span class="Maybe">     434:</span> <span class="k">     */</span>
<a name="435" /><span class="Maybe">     435:</span>     <span class="b">wait_queue_head_t</span>    <span class="f">*</span> <span class="b">wait_table</span><span class="f">;</span>
<a name="436" /><span class="Maybe">     436:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">wait_table_hash_nr_entries</span><span class="f">;</span>
<a name="437" /><span class="Maybe">     437:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">wait_table_bits</span><span class="f">;</span>
<a name="438" /><span class="Maybe">     438:</span> 
<a name="439" /><span class="Maybe">     439:</span>     <span class="k">/*</span>
<a name="440" /><span class="Maybe">     440:</span> <span class="k">     * Discontig memory support fields.</span>
<a name="441" /><span class="Maybe">     441:</span> <span class="k">     */</span>
<a name="442" /><span class="Maybe">     442:</span>     <span class="m">struct</span> <span class="b">pglist_data</span>    <span class="f">*</span><span class="b">zone_pgdat</span><span class="f">;</span>
<a name="443" /><span class="Maybe">     443:</span>     <span class="k">/* zone_start_pfn == zone_start_paddr &gt;&gt; PAGE_SHIFT */</span>
<a name="444" /><span class="Maybe">     444:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">zone_start_pfn</span><span class="f">;</span>
<a name="445" /><span class="Maybe">     445:</span> 
<a name="446" /><span class="Maybe">     446:</span>     <span class="k">/*</span>
<a name="447" /><span class="Maybe">     447:</span> <span class="k">     * spanned_pages is the total pages spanned by the zone, including</span>
<a name="448" /><span class="Maybe">     448:</span> <span class="k">     * holes, which is calculated as:</span>
<a name="449" /><span class="Maybe">     449:</span> <span class="k">     *     spanned_pages = zone_end_pfn - zone_start_pfn;</span>
<a name="450" /><span class="Maybe">     450:</span> <span class="k">     *</span>
<a name="451" /><span class="Maybe">     451:</span> <span class="k">     * present_pages is physical pages existing within the zone, which</span>
<a name="452" /><span class="Maybe">     452:</span> <span class="k">     * is calculated as:</span>
<a name="453" /><span class="Maybe">     453:</span> <span class="k">     *    present_pages = spanned_pages - absent_pages(pages in holes);</span>
<a name="454" /><span class="Maybe">     454:</span> <span class="k">     *</span>
<a name="455" /><span class="Maybe">     455:</span> <span class="k">     * managed_pages is present pages managed by the buddy system, which</span>
<a name="456" /><span class="Maybe">     456:</span> <span class="k">     * is calculated as (reserved_pages includes pages allocated by the</span>
<a name="457" /><span class="Maybe">     457:</span> <span class="k">     * bootmem allocator):</span>
<a name="458" /><span class="Maybe">     458:</span> <span class="k">     *    managed_pages = present_pages - reserved_pages;</span>
<a name="459" /><span class="Maybe">     459:</span> <span class="k">     *</span>
<a name="460" /><span class="Maybe">     460:</span> <span class="k">     * So present_pages may be used by memory hotplug or memory power</span>
<a name="461" /><span class="Maybe">     461:</span> <span class="k">     * management logic to figure out unmanaged pages by checking</span>
<a name="462" /><span class="Maybe">     462:</span> <span class="k">     * (present_pages - managed_pages). And managed_pages should be used</span>
<a name="463" /><span class="Maybe">     463:</span> <span class="k">     * by page allocator and vm scanner to calculate all kinds of watermarks</span>
<a name="464" /><span class="Maybe">     464:</span> <span class="k">     * and thresholds.</span>
<a name="465" /><span class="Maybe">     465:</span> <span class="k">     *</span>
<a name="466" /><span class="Maybe">     466:</span> <span class="k">     * Locking rules:</span>
<a name="467" /><span class="Maybe">     467:</span> <span class="k">     *</span>
<a name="468" /><span class="Maybe">     468:</span> <span class="k">     * zone_start_pfn and spanned_pages are protected by span_seqlock.</span>
<a name="469" /><span class="Maybe">     469:</span> <span class="k">     * It is a seqlock because it has to be read outside of zone-&gt;lock,</span>
<a name="470" /><span class="Maybe">     470:</span> <span class="k">     * and it is done in the main allocator path.  But, it is written</span>
<a name="471" /><span class="Maybe">     471:</span> <span class="k">     * quite infrequently.</span>
<a name="472" /><span class="Maybe">     472:</span> <span class="k">     *</span>
<a name="473" /><span class="Maybe">     473:</span> <span class="k">     * The span_seq lock is declared along with zone-&gt;lock because it is</span>
<a name="474" /><span class="Maybe">     474:</span> <span class="k">     * frequently read in proximity to zone-&gt;lock.  It&apos;s good to</span>
<a name="475" /><span class="Maybe">     475:</span> <span class="k">     * give them a chance of being in the same cacheline.</span>
<a name="476" /><span class="Maybe">     476:</span> <span class="k">     *</span>
<a name="477" /><span class="Maybe">     477:</span> <span class="k">     * Write access to present_pages at runtime should be protected by</span>
<a name="478" /><span class="Maybe">     478:</span> <span class="k">     * lock_memory_hotplug()/unlock_memory_hotplug().  Any reader who can&apos;t</span>
<a name="479" /><span class="Maybe">     479:</span> <span class="k">     * tolerant drift of present_pages should hold memory hotplug lock to</span>
<a name="480" /><span class="Maybe">     480:</span> <span class="k">     * get a stable value.</span>
<a name="481" /><span class="Maybe">     481:</span> <span class="k">     *</span>
<a name="482" /><span class="Maybe">     482:</span> <span class="k">     * Read access to managed_pages should be safe because it&apos;s unsigned</span>
<a name="483" /><span class="Maybe">     483:</span> <span class="k">     * long. Write access to zone-&gt;managed_pages and totalram_pages are</span>
<a name="484" /><span class="Maybe">     484:</span> <span class="k">     * protected by managed_page_count_lock at runtime. Idealy only</span>
<a name="485" /><span class="Maybe">     485:</span> <span class="k">     * adjust_managed_page_count() should be used instead of directly</span>
<a name="486" /><span class="Maybe">     486:</span> <span class="k">     * touching zone-&gt;managed_pages and totalram_pages.</span>
<a name="487" /><span class="Maybe">     487:</span> <span class="k">     */</span>
<a name="488" /><span class="Maybe">     488:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">spanned_pages</span><span class="f">;</span>
<a name="489" /><span class="Maybe">     489:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">present_pages</span><span class="f">;</span>
<a name="490" /><span class="Maybe">     490:</span>     <span class="m">unsigned</span> <span class="m">long</span>        <span class="b">managed_pages</span><span class="f">;</span>
<a name="491" /><span class="Maybe">     491:</span> 
<a name="492" /><span class="Maybe">     492:</span>     <span class="k">/*</span>
<a name="493" /><span class="Maybe">     493:</span> <span class="k">     * rarely used fields:</span>
<a name="494" /><span class="Maybe">     494:</span> <span class="k">     */</span>
<a name="495" /><span class="Maybe">     495:</span>     <span class="m">const</span> <span class="m">char</span>        <span class="f">*</span><span class="b">name</span><span class="f">;</span>
<a name="496" /><span class="Maybe">     496:</span> <span class="f">}</span> <a href="cpu.c_macros_ref.html#_X19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcF8w"><span class="b">____cacheline_internodealigned_in_smp</span></a><span class="f">;</span>
<a name="497" /><span class="Maybe">     497:</span> 
<a name="498" /><span class="Maybe">     498:</span> <span class="m">typedef</span> <span class="m">enum</span> <span class="f">{</span>
<a name="499" /><span class="Maybe">     499:</span>     <span class="b">ZONE_RECLAIM_LOCKED</span><span class="f">,</span>        <span class="k">/* prevents concurrent reclaim */</span>
<a name="500" /><span class="Maybe">     500:</span>     <span class="b">ZONE_OOM_LOCKED</span><span class="f">,</span>        <span class="k">/* zone is in OOM killer zonelist */</span>
<a name="501" /><span class="Maybe">     501:</span>     <span class="b">ZONE_CONGESTED</span><span class="f">,</span>            <span class="k">/* zone has many dirty pages backed by</span>
<a name="502" /><span class="Maybe">     502:</span> <span class="k">                     * a congested BDI</span>
<a name="503" /><span class="Maybe">     503:</span> <span class="k">                     */</span>
<a name="504" /><span class="Maybe">     504:</span>     <span class="b">ZONE_TAIL_LRU_DIRTY</span><span class="f">,</span>        <span class="k">/* reclaim scanning has recently found</span>
<a name="505" /><span class="Maybe">     505:</span> <span class="k">                     * many dirty file pages at the tail</span>
<a name="506" /><span class="Maybe">     506:</span> <span class="k">                     * of the LRU.</span>
<a name="507" /><span class="Maybe">     507:</span> <span class="k">                     */</span>
<a name="508" /><span class="Maybe">     508:</span>     <span class="b">ZONE_WRITEBACK</span><span class="f">,</span>            <span class="k">/* reclaim scanning has recently found</span>
<a name="509" /><span class="Maybe">     509:</span> <span class="k">                     * many pages under writeback</span>
<a name="510" /><span class="Maybe">     510:</span> <span class="k">                     */</span>
<a name="511" /><span class="Maybe">     511:</span> <span class="f">}</span> <span class="b">zone_flags_t</span><span class="f">;</span>
<a name="512" /><span class="Maybe">     512:</span> 
<a name="513" /><span class="Maybe">     513:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">zone_set_flag</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">,</span> <span class="b">zone_flags_t</span> <span class="b">flag</span><span class="f">)</span>
<a name="514" /><span class="Maybe">     514:</span> <span class="f">{</span>
<a name="515" /><span class="Maybe">     515:</span>     <span class="b">set_bit</span><span class="f">(</span><span class="b">flag</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="516" /><span class="Maybe">     516:</span> <span class="f">}</span>
<a name="517" /><span class="Maybe">     517:</span> 
<a name="518" /><span class="Maybe">     518:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zone_test_and_set_flag</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">,</span> <span class="b">zone_flags_t</span> <span class="b">flag</span><span class="f">)</span>
<a name="519" /><span class="Maybe">     519:</span> <span class="f">{</span>
<a name="520" /><span class="Maybe">     520:</span>     <span class="m">return</span> <span class="b">test_and_set_bit</span><span class="f">(</span><span class="b">flag</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="521" /><span class="Maybe">     521:</span> <span class="f">}</span>
<a name="522" /><span class="Maybe">     522:</span> 
<a name="523" /><span class="Maybe">     523:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">zone_clear_flag</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">,</span> <span class="b">zone_flags_t</span> <span class="b">flag</span><span class="f">)</span>
<a name="524" /><span class="Maybe">     524:</span> <span class="f">{</span>
<a name="525" /><span class="Maybe">     525:</span>     <span class="b">clear_bit</span><span class="f">(</span><span class="b">flag</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="526" /><span class="Maybe">     526:</span> <span class="f">}</span>
<a name="527" /><span class="Maybe">     527:</span> 
<a name="528" /><span class="Maybe">     528:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zone_is_reclaim_congested</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="529" /><span class="Maybe">     529:</span> <span class="f">{</span>
<a name="530" /><span class="Maybe">     530:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">ZONE_CONGESTED</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="531" /><span class="Maybe">     531:</span> <span class="f">}</span>
<a name="532" /><span class="Maybe">     532:</span> 
<a name="533" /><span class="Maybe">     533:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zone_is_reclaim_dirty</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="534" /><span class="Maybe">     534:</span> <span class="f">{</span>
<a name="535" /><span class="Maybe">     535:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">ZONE_TAIL_LRU_DIRTY</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="536" /><span class="Maybe">     536:</span> <span class="f">}</span>
<a name="537" /><span class="Maybe">     537:</span> 
<a name="538" /><span class="Maybe">     538:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zone_is_reclaim_writeback</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="539" /><span class="Maybe">     539:</span> <span class="f">{</span>
<a name="540" /><span class="Maybe">     540:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">ZONE_WRITEBACK</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="541" /><span class="Maybe">     541:</span> <span class="f">}</span>
<a name="542" /><span class="Maybe">     542:</span> 
<a name="543" /><span class="Maybe">     543:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zone_is_reclaim_locked</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="544" /><span class="Maybe">     544:</span> <span class="f">{</span>
<a name="545" /><span class="Maybe">     545:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">ZONE_RECLAIM_LOCKED</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="546" /><span class="Maybe">     546:</span> <span class="f">}</span>
<a name="547" /><span class="Maybe">     547:</span> 
<a name="548" /><span class="Maybe">     548:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zone_is_oom_locked</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="549" /><span class="Maybe">     549:</span> <span class="f">{</span>
<a name="550" /><span class="Maybe">     550:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_dGVzdF9iaXRfMA__"><span class="b">test_bit</span></a><span class="f">(</span><span class="b">ZONE_OOM_LOCKED</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="551" /><span class="Maybe">     551:</span> <span class="f">}</span>
<a name="552" /><span class="Maybe">     552:</span> 
<a name="553" /><span class="Maybe">     553:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">zone_end_pfn</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="554" /><span class="Maybe">     554:</span> <span class="f">{</span>
<a name="555" /><span class="Maybe">     555:</span>     <span class="m">return</span> <span class="b">zone</span><span class="f">-&gt;</span><span class="b">zone_start_pfn</span> <span class="f">+</span> <span class="b">zone</span><span class="f">-&gt;</span><span class="b">spanned_pages</span><span class="f">;</span>
<a name="556" /><span class="Maybe">     556:</span> <span class="f">}</span>
<a name="557" /><span class="Maybe">     557:</span> 
<a name="558" /><span class="Maybe">     558:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">zone_spans_pfn</span><span class="f">(</span><span class="m">const</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">pfn</span><span class="f">)</span>
<a name="559" /><span class="Maybe">     559:</span> <span class="f">{</span>
<a name="560" /><span class="Maybe">     560:</span>     <span class="m">return</span> <span class="b">zone</span><span class="f">-&gt;</span><span class="b">zone_start_pfn</span> <span class="f">&lt;=</span> <span class="b">pfn</span> <span class="f">&amp;&amp;</span> <span class="b">pfn</span> <span class="f">&lt;</span> <span class="b">zone_end_pfn</span><span class="f">(</span><span class="b">zone</span><span class="f">)</span><span class="f">;</span>
<a name="561" /><span class="Maybe">     561:</span> <span class="f">}</span>
<a name="562" /><span class="Maybe">     562:</span> 
<a name="563" /><span class="Maybe">     563:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">zone_is_initialized</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="564" /><span class="Maybe">     564:</span> <span class="f">{</span>
<a name="565" /><span class="Maybe">     565:</span>     <span class="m">return</span> <span class="f">!</span><span class="f">!</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">wait_table</span><span class="f">;</span>
<a name="566" /><span class="Maybe">     566:</span> <span class="f">}</span>
<a name="567" /><span class="Maybe">     567:</span> 
<a name="568" /><span class="Maybe">     568:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">zone_is_empty</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="569" /><span class="Maybe">     569:</span> <span class="f">{</span>
<a name="570" /><span class="Maybe">     570:</span>     <span class="m">return</span> <span class="b">zone</span><span class="f">-&gt;</span><span class="b">spanned_pages</span> <span class="f">==</span> <span class="c">0</span><span class="f">;</span>
<a name="571" /><span class="Maybe">     571:</span> <span class="f">}</span>
<a name="572" /><span class="Maybe">     572:</span> 
<a name="573" /><span class="Maybe">     573:</span> <span class="k">/*</span>
<a name="574" /><span class="Maybe">     574:</span> <span class="k"> * The &quot;priority&quot; of VM scanning is how much of the queues we will scan in one</span>
<a name="575" /><span class="Maybe">     575:</span> <span class="k"> * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the</span>
<a name="576" /><span class="Maybe">     576:</span> <span class="k"> * queues (&quot;queue_length &gt;&gt; 12&quot;) during an aging round.</span>
<a name="577" /><span class="Maybe">     577:</span> <span class="k"> */</span>
<a name="578" /><span class="Maybe">     578:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_REVGX1BSSU9SSVRZXzA_"><span class="b">DEF_PRIORITY</span></a> <span class="c">12</span>
<a name="579" /><span class="Maybe">     579:</span> 
<a name="580" /><span class="Maybe">     580:</span> <span class="k">/* Maximum number of zones on a zonelist */</span>
<a name="581" /><span class="Maybe">     581:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TUFYX1pPTkVTX1BFUl9aT05FTElTVF8w"><span class="b">MAX_ZONES_PER_ZONELIST</span></a> <span class="f">(</span><a href="cpu.c_macros_ref.html#_TUFYX05VTU5PREVTXzA_"><span class="b">MAX_NUMNODES</span></a> <span class="f">*</span> <a href="cpu.c_macros_ref.html#_TUFYX05SX1pPTkVTXzA_"><span class="b">MAX_NR_ZONES</span></a><span class="f">)</span>
<a name="582" /><span class="Maybe">     582:</span> 
<a name="583" /><span class="Maybe">     583:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05VTUFfMA__"><span class="b">CONFIG_NUMA</span></a>
<a name="584" /><span class="Maybe">     584:</span> 
<a name="585" /><span class="Maybe">     585:</span> <span class="k">/*</span>
<a name="586" /><span class="Maybe">     586:</span> <span class="k"> * The NUMA zonelists are doubled because we need zonelists that restrict the</span>
<a name="587" /><span class="Maybe">     587:</span> <span class="k"> * allocations to a single node for GFP_THISNODE.</span>
<a name="588" /><span class="Maybe">     588:</span> <span class="k"> *</span>
<a name="589" /><span class="Maybe">     589:</span> <span class="k"> * [0]    : Zonelist with fallback</span>
<a name="590" /><span class="Maybe">     590:</span> <span class="k"> * [1]    : No fallback (GFP_THISNODE)</span>
<a name="591" /><span class="Maybe">     591:</span> <span class="k"> */</span>
<a name="592" /><span class="Maybe">     592:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TUFYX1pPTkVMSVNUU18w"><span class="b">MAX_ZONELISTS</span></a> <span class="c">2</span>
<a name="593" /><span class="Maybe">     593:</span> 
<a name="594" /><span class="Maybe">     594:</span> 
<a name="595" /><span class="Maybe">     595:</span> <span class="k">/*</span>
<a name="596" /><span class="Maybe">     596:</span> <span class="k"> * We cache key information from each zonelist for smaller cache</span>
<a name="597" /><span class="Maybe">     597:</span> <span class="k"> * footprint when scanning for free pages in get_page_from_freelist().</span>
<a name="598" /><span class="Maybe">     598:</span> <span class="k"> *</span>
<a name="599" /><span class="Maybe">     599:</span> <span class="k"> * 1) The BITMAP fullzones tracks which zones in a zonelist have come</span>
<a name="600" /><span class="Maybe">     600:</span> <span class="k"> *    up short of free memory since the last time (last_fullzone_zap)</span>
<a name="601" /><span class="Maybe">     601:</span> <span class="k"> *    we zero&apos;d fullzones.</span>
<a name="602" /><span class="Maybe">     602:</span> <span class="k"> * 2) The array z_to_n[] maps each zone in the zonelist to its node</span>
<a name="603" /><span class="Maybe">     603:</span> <span class="k"> *    id, so that we can efficiently evaluate whether that node is</span>
<a name="604" /><span class="Maybe">     604:</span> <span class="k"> *    set in the current tasks mems_allowed.</span>
<a name="605" /><span class="Maybe">     605:</span> <span class="k"> *</span>
<a name="606" /><span class="Maybe">     606:</span> <span class="k"> * Both fullzones and z_to_n[] are one-to-one with the zonelist,</span>
<a name="607" /><span class="Maybe">     607:</span> <span class="k"> * indexed by a zones offset in the zonelist zones[] array.</span>
<a name="608" /><span class="Maybe">     608:</span> <span class="k"> *</span>
<a name="609" /><span class="Maybe">     609:</span> <span class="k"> * The get_page_from_freelist() routine does two scans.  During the</span>
<a name="610" /><span class="Maybe">     610:</span> <span class="k"> * first scan, we skip zones whose corresponding bit in &apos;fullzones&apos;</span>
<a name="611" /><span class="Maybe">     611:</span> <span class="k"> * is set or whose corresponding node in current-&gt;mems_allowed (which</span>
<a name="612" /><span class="Maybe">     612:</span> <span class="k"> * comes from cpusets) is not set.  During the second scan, we bypass</span>
<a name="613" /><span class="Maybe">     613:</span> <span class="k"> * this zonelist_cache, to ensure we look methodically at each zone.</span>
<a name="614" /><span class="Maybe">     614:</span> <span class="k"> *</span>
<a name="615" /><span class="Maybe">     615:</span> <span class="k"> * Once per second, we zero out (zap) fullzones, forcing us to</span>
<a name="616" /><span class="Maybe">     616:</span> <span class="k"> * reconsider nodes that might have regained more free memory.</span>
<a name="617" /><span class="Maybe">     617:</span> <span class="k"> * The field last_full_zap is the time we last zapped fullzones.</span>
<a name="618" /><span class="Maybe">     618:</span> <span class="k"> *</span>
<a name="619" /><span class="Maybe">     619:</span> <span class="k"> * This mechanism reduces the amount of time we waste repeatedly</span>
<a name="620" /><span class="Maybe">     620:</span> <span class="k"> * reexaming zones for free memory when they just came up low on</span>
<a name="621" /><span class="Maybe">     621:</span> <span class="k"> * memory momentarilly ago.</span>
<a name="622" /><span class="Maybe">     622:</span> <span class="k"> *</span>
<a name="623" /><span class="Maybe">     623:</span> <span class="k"> * The zonelist_cache struct members logically belong in struct</span>
<a name="624" /><span class="Maybe">     624:</span> <span class="k"> * zonelist.  However, the mempolicy zonelists constructed for</span>
<a name="625" /><span class="Maybe">     625:</span> <span class="k"> * MPOL_BIND are intentionally variable length (and usually much</span>
<a name="626" /><span class="Maybe">     626:</span> <span class="k"> * shorter).  A general purpose mechanism for handling structs with</span>
<a name="627" /><span class="Maybe">     627:</span> <span class="k"> * multiple variable length members is more mechanism than we want</span>
<a name="628" /><span class="Maybe">     628:</span> <span class="k"> * here.  We resort to some special case hackery instead.</span>
<a name="629" /><span class="Maybe">     629:</span> <span class="k"> *</span>
<a name="630" /><span class="Maybe">     630:</span> <span class="k"> * The MPOL_BIND zonelists don&apos;t need this zonelist_cache (in good</span>
<a name="631" /><span class="Maybe">     631:</span> <span class="k"> * part because they are shorter), so we put the fixed length stuff</span>
<a name="632" /><span class="Maybe">     632:</span> <span class="k"> * at the front of the zonelist struct, ending in a variable length</span>
<a name="633" /><span class="Maybe">     633:</span> <span class="k"> * zones[], as is needed by MPOL_BIND.</span>
<a name="634" /><span class="Maybe">     634:</span> <span class="k"> *</span>
<a name="635" /><span class="Maybe">     635:</span> <span class="k"> * Then we put the optional zonelist cache on the end of the zonelist</span>
<a name="636" /><span class="Maybe">     636:</span> <span class="k"> * struct.  This optional stuff is found by a &apos;zlcache_ptr&apos; pointer in</span>
<a name="637" /><span class="Maybe">     637:</span> <span class="k"> * the fixed length portion at the front of the struct.  This pointer</span>
<a name="638" /><span class="Maybe">     638:</span> <span class="k"> * both enables us to find the zonelist cache, and in the case of</span>
<a name="639" /><span class="Maybe">     639:</span> <span class="k"> * MPOL_BIND zonelists, (which will just set the zlcache_ptr to NULL)</span>
<a name="640" /><span class="Maybe">     640:</span> <span class="k"> * to know that the zonelist cache is not there.</span>
<a name="641" /><span class="Maybe">     641:</span> <span class="k"> *</span>
<a name="642" /><span class="Maybe">     642:</span> <span class="k"> * The end result is that struct zonelists come in two flavors:</span>
<a name="643" /><span class="Maybe">     643:</span> <span class="k"> *  1) The full, fixed length version, shown below, and</span>
<a name="644" /><span class="Maybe">     644:</span> <span class="k"> *  2) The custom zonelists for MPOL_BIND.</span>
<a name="645" /><span class="Maybe">     645:</span> <span class="k"> * The custom MPOL_BIND zonelists have a NULL zlcache_ptr and no zlcache.</span>
<a name="646" /><span class="Maybe">     646:</span> <span class="k"> *</span>
<a name="647" /><span class="Maybe">     647:</span> <span class="k"> * Even though there may be multiple CPU cores on a node modifying</span>
<a name="648" /><span class="Maybe">     648:</span> <span class="k"> * fullzones or last_full_zap in the same zonelist_cache at the same</span>
<a name="649" /><span class="Maybe">     649:</span> <span class="k"> * time, we don&apos;t lock it.  This is just hint data - if it is wrong now</span>
<a name="650" /><span class="Maybe">     650:</span> <span class="k"> * and then, the allocator will still function, perhaps a bit slower.</span>
<a name="651" /><span class="Maybe">     651:</span> <span class="k"> */</span>
<a name="652" /><span class="Maybe">     652:</span> 
<a name="653" /><span class="Maybe">     653:</span> 
<a name="654" /><span class="Maybe">     654:</span> <span class="m">struct</span> <span class="b">zonelist_cache</span> <span class="f">{</span>
<a name="655" /><span class="Maybe">     655:</span>     <span class="m">unsigned</span> <span class="m">short</span> <span class="b">z_to_n</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX1pPTkVTX1BFUl9aT05FTElTVF8w"><span class="b">MAX_ZONES_PER_ZONELIST</span></a><span class="f">]</span><span class="f">;</span>        <span class="k">/* zone-&gt;nid */</span>
<a name="656" /><span class="Maybe">     656:</span>     <a href="cpu.c_macros_ref.html#_REVDTEFSRV9CSVRNQVBfMA__"><span class="b">DECLARE_BITMAP</span></a><span class="f">(</span><span class="b">fullzones</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_TUFYX1pPTkVTX1BFUl9aT05FTElTVF8w"><span class="b">MAX_ZONES_PER_ZONELIST</span></a><span class="f">)</span><span class="f">;</span>    <span class="k">/* zone full? */</span>
<a name="657" /><span class="Maybe">     657:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">last_full_zap</span><span class="f">;</span>        <span class="k">/* when last zap&apos;d (jiffies) */</span>
<a name="658" /><span class="Maybe">     658:</span> <span class="f">}</span><span class="f">;</span>
<a name="659" /><span class="False">     659:</span> <span class="f">#</span><span class="n">else</span>
<a name="660" /><span class="False">     660:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TUFYX1pPTkVMSVNUU18w"><span class="b">MAX_ZONELISTS</span></a> <span class="c">1</span>
<a name="661" /><span class="False">     661:</span> <span class="m">struct</span> <span class="b">zonelist_cache</span><span class="f">;</span>
<a name="662" /><span class="Maybe">     662:</span> <span class="f">#</span><span class="n">endif</span>
<a name="663" /><span class="Maybe">     663:</span> 
<a name="664" /><span class="Maybe">     664:</span> <span class="k">/*</span>
<a name="665" /><span class="Maybe">     665:</span> <span class="k"> * This struct contains information about a zone in a zonelist. It is stored</span>
<a name="666" /><span class="Maybe">     666:</span> <span class="k"> * here to avoid dereferences into large structures and lookups of tables</span>
<a name="667" /><span class="Maybe">     667:</span> <span class="k"> */</span>
<a name="668" /><span class="Maybe">     668:</span> <span class="m">struct</span> <span class="b">zoneref</span> <span class="f">{</span>
<a name="669" /><span class="Maybe">     669:</span>     <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">;</span>    <span class="k">/* Pointer to actual zone */</span>
<a name="670" /><span class="Maybe">     670:</span>     <span class="m">int</span> <a href="cpu.c_macros_noref.html#_em9uZV9pZHhfMA__"><span class="b">zone_idx</span></a><span class="f">;</span>        <span class="k">/* zone_idx(zoneref-&gt;zone) */</span>
<a name="671" /><span class="Maybe">     671:</span> <span class="f">}</span><span class="f">;</span>
<a name="672" /><span class="Maybe">     672:</span> 
<a name="673" /><span class="Maybe">     673:</span> <span class="k">/*</span>
<a name="674" /><span class="Maybe">     674:</span> <span class="k"> * One allocation request operates on a zonelist. A zonelist</span>
<a name="675" /><span class="Maybe">     675:</span> <span class="k"> * is a list of zones, the first one is the &apos;goal&apos; of the</span>
<a name="676" /><span class="Maybe">     676:</span> <span class="k"> * allocation, the other zones are fallback zones, in decreasing</span>
<a name="677" /><span class="Maybe">     677:</span> <span class="k"> * priority.</span>
<a name="678" /><span class="Maybe">     678:</span> <span class="k"> *</span>
<a name="679" /><span class="Maybe">     679:</span> <span class="k"> * If zlcache_ptr is not NULL, then it is just the address of zlcache,</span>
<a name="680" /><span class="Maybe">     680:</span> <span class="k"> * as explained above.  If zlcache_ptr is NULL, there is no zlcache.</span>
<a name="681" /><span class="Maybe">     681:</span> <span class="k"> * *</span>
<a name="682" /><span class="Maybe">     682:</span> <span class="k"> * To speed the reading of the zonelist, the zonerefs contain the zone index</span>
<a name="683" /><span class="Maybe">     683:</span> <span class="k"> * of the entry being read. Helper functions to access information given</span>
<a name="684" /><span class="Maybe">     684:</span> <span class="k"> * a struct zoneref are</span>
<a name="685" /><span class="Maybe">     685:</span> <span class="k"> *</span>
<a name="686" /><span class="Maybe">     686:</span> <span class="k"> * zonelist_zone()    - Return the struct zone * for an entry in _zonerefs</span>
<a name="687" /><span class="Maybe">     687:</span> <span class="k"> * zonelist_zone_idx()    - Return the index of the zone for an entry</span>
<a name="688" /><span class="Maybe">     688:</span> <span class="k"> * zonelist_node_idx()    - Return the index of the node for an entry</span>
<a name="689" /><span class="Maybe">     689:</span> <span class="k"> */</span>
<a name="690" /><span class="Maybe">     690:</span> <span class="m">struct</span> <span class="b">zonelist</span> <span class="f">{</span>
<a name="691" /><span class="Maybe">     691:</span>     <span class="m">struct</span> <span class="b">zonelist_cache</span> <span class="f">*</span><span class="b">zlcache_ptr</span><span class="f">;</span>             <span class="l">// NULL or &amp;zlcache</span>
<a name="692" /><span class="Maybe">     692:</span>     <span class="m">struct</span> <span class="b">zoneref</span> <span class="b">_zonerefs</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX1pPTkVTX1BFUl9aT05FTElTVF8w"><span class="b">MAX_ZONES_PER_ZONELIST</span></a> <span class="f">+</span> <span class="c">1</span><span class="f">]</span><span class="f">;</span>
<a name="693" /><span class="Maybe">     693:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05VTUFfMA__"><span class="b">CONFIG_NUMA</span></a>
<a name="694" /><span class="Maybe">     694:</span>     <span class="m">struct</span> <span class="b">zonelist_cache</span> <span class="b">zlcache</span><span class="f">;</span>                 <span class="l">// optional ...</span>
<a name="695" /><span class="Maybe">     695:</span> <span class="f">#</span><span class="n">endif</span>
<a name="696" /><span class="Maybe">     696:</span> <span class="f">}</span><span class="f">;</span>
<a name="697" /><span class="Maybe">     697:</span> 
<a name="698" /><span class="Maybe">     698:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVBfMA__"><span class="b">CONFIG_HAVE_MEMBLOCK_NODE_MAP</span></a>
<a name="699" /><span class="Maybe">     699:</span> <span class="m">struct</span> <span class="b">node_active_region</span> <span class="f">{</span>
<a name="700" /><span class="Maybe">     700:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">start_pfn</span><span class="f">;</span>
<a name="701" /><span class="Maybe">     701:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">end_pfn</span><span class="f">;</span>
<a name="702" /><span class="Maybe">     702:</span>     <span class="m">int</span> <span class="b">nid</span><span class="f">;</span>
<a name="703" /><span class="Maybe">     703:</span> <span class="f">}</span><span class="f">;</span>
<a name="704" /><span class="Maybe">     704:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_HAVE_MEMBLOCK_NODE_MAP */</span>
<a name="705" /><span class="Maybe">     705:</span> 
<a name="706" /><span class="Maybe">     706:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">CONFIG_DISCONTIGMEM</span>
<a name="707" /><span class="Maybe">     707:</span> <span class="k">/* The array of struct pages - for discontigmem use pgdat-&gt;lmem_map */</span>
<a name="708" /><span class="Maybe">     708:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="b">mem_map</span><span class="f">;</span>
<a name="709" /><span class="Maybe">     709:</span> <span class="f">#</span><span class="n">endif</span>
<a name="710" /><span class="Maybe">     710:</span> 
<a name="711" /><span class="Maybe">     711:</span> <span class="k">/*</span>
<a name="712" /><span class="Maybe">     712:</span> <span class="k"> * The pg_data_t structure is used in machines with CONFIG_DISCONTIGMEM</span>
<a name="713" /><span class="Maybe">     713:</span> <span class="k"> * (mostly NUMA machines?) to denote a higher-level memory zone than the</span>
<a name="714" /><span class="Maybe">     714:</span> <span class="k"> * zone denotes.</span>
<a name="715" /><span class="Maybe">     715:</span> <span class="k"> *</span>
<a name="716" /><span class="Maybe">     716:</span> <span class="k"> * On NUMA machines, each NUMA node would have a pg_data_t to describe</span>
<a name="717" /><span class="Maybe">     717:</span> <span class="k"> * it&apos;s memory layout.</span>
<a name="718" /><span class="Maybe">     718:</span> <span class="k"> *</span>
<a name="719" /><span class="Maybe">     719:</span> <span class="k"> * Memory statistics and page replacement data structures are maintained on a</span>
<a name="720" /><span class="Maybe">     720:</span> <span class="k"> * per-zone basis.</span>
<a name="721" /><span class="Maybe">     721:</span> <span class="k"> */</span>
<a name="722" /><span class="Maybe">     722:</span> <span class="m">struct</span> <span class="b">bootmem_data</span><span class="f">;</span>
<a name="723" /><span class="Maybe">     723:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">pglist_data</span> <span class="f">{</span>
<a name="724" /><span class="Maybe">     724:</span>     <span class="m">struct</span> <span class="b">zone</span> <span class="b">node_zones</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX05SX1pPTkVTXzA_"><span class="b">MAX_NR_ZONES</span></a><span class="f">]</span><span class="f">;</span>
<a name="725" /><span class="Maybe">     725:</span>     <span class="m">struct</span> <span class="b">zonelist</span> <span class="b">node_zonelists</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX1pPTkVMSVNUU18w"><span class="b">MAX_ZONELISTS</span></a><span class="f">]</span><span class="f">;</span>
<a name="726" /><span class="Maybe">     726:</span>     <span class="m">int</span> <span class="b">nr_zones</span><span class="f">;</span>
<a name="727" /><span class="False">     727:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_FLAT_NODE_MEM_MAP</span>    <span class="k">/* means !SPARSEMEM */</span>
<a name="728" /><span class="False">     728:</span>     <span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="b">node_mem_map</span><span class="f">;</span>
<a name="729" /><span class="False">     729:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_MEMCG</span>
<a name="730" /><span class="False">     730:</span>     <span class="m">struct</span> <span class="b">page_cgroup</span> <span class="f">*</span><span class="b">node_page_cgroup</span><span class="f">;</span>
<a name="731" /><span class="False">     731:</span> <span class="f">#</span><span class="n">endif</span>
<a name="732" /><span class="Maybe">     732:</span> <span class="f">#</span><span class="n">endif</span>
<a name="733" /><span class="False">     733:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05PX0JPT1RNRU1fMA__"><span class="b">CONFIG_NO_BOOTMEM</span></a>
<a name="734" /><span class="False">     734:</span>     <span class="m">struct</span> <span class="b">bootmem_data</span> <span class="f">*</span><span class="b">bdata</span><span class="f">;</span>
<a name="735" /><span class="Maybe">     735:</span> <span class="f">#</span><span class="n">endif</span>
<a name="736" /><span class="False">     736:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_MEMORY_HOTPLUG</span>
<a name="737" /><span class="False">     737:</span>     <span class="k">/*</span>
<a name="738" /><span class="False">     738:</span> <span class="k">     * Must be held any time you expect node_start_pfn, node_present_pages</span>
<a name="739" /><span class="False">     739:</span> <span class="k">     * or node_spanned_pages stay constant.  Holding this will also</span>
<a name="740" /><span class="False">     740:</span> <span class="k">     * guarantee that any pfn_valid() stays that way.</span>
<a name="741" /><span class="False">     741:</span> <span class="k">     *</span>
<a name="742" /><span class="False">     742:</span> <span class="k">     * pgdat_resize_lock() and pgdat_resize_unlock() are provided to</span>
<a name="743" /><span class="False">     743:</span> <span class="k">     * manipulate node_size_lock without checking for CONFIG_MEMORY_HOTPLUG.</span>
<a name="744" /><span class="False">     744:</span> <span class="k">     *</span>
<a name="745" /><span class="False">     745:</span> <span class="k">     * Nests above zone-&gt;lock and zone-&gt;span_seqlock</span>
<a name="746" /><span class="False">     746:</span> <span class="k">     */</span>
<a name="747" /><span class="False">     747:</span>     <span class="b">spinlock_t</span> <span class="b">node_size_lock</span><span class="f">;</span>
<a name="748" /><span class="Maybe">     748:</span> <span class="f">#</span><span class="n">endif</span>
<a name="749" /><span class="Maybe">     749:</span>     <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_noref.html#_bm9kZV9zdGFydF9wZm5fMA__"><span class="b">node_start_pfn</span></a><span class="f">;</span>
<a name="750" /><span class="Maybe">     750:</span>     <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_bm9kZV9wcmVzZW50X3BhZ2VzXzA_"><span class="b">node_present_pages</span></a><span class="f">;</span> <span class="k">/* total number of physical pages */</span>
<a name="751" /><span class="Maybe">     751:</span>     <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_noref.html#_bm9kZV9zcGFubmVkX3BhZ2VzXzA_"><span class="b">node_spanned_pages</span></a><span class="f">;</span> <span class="k">/* total size of physical page</span>
<a name="752" /><span class="Maybe">     752:</span> <span class="k">                         range, including holes */</span>
<a name="753" /><span class="Maybe">     753:</span>     <span class="m">int</span> <span class="b">node_id</span><span class="f">;</span>
<a name="754" /><span class="Maybe">     754:</span>     <span class="b">nodemask_t</span> <span class="b">reclaim_nodes</span><span class="f">;</span>    <span class="k">/* Nodes allowed to reclaim from */</span>
<a name="755" /><span class="Maybe">     755:</span>     <span class="b">wait_queue_head_t</span> <span class="b">kswapd_wait</span><span class="f">;</span>
<a name="756" /><span class="Maybe">     756:</span>     <span class="b">wait_queue_head_t</span> <span class="b">pfmemalloc_wait</span><span class="f">;</span>
<a name="757" /><span class="Maybe">     757:</span>     <span class="m">struct</span> <span class="b">task_struct</span> <span class="f">*</span><span class="b">kswapd</span><span class="f">;</span>    <span class="k">/* Protected by lock_memory_hotplug() */</span>
<a name="758" /><span class="Maybe">     758:</span>     <span class="m">int</span> <span class="b">kswapd_max_order</span><span class="f">;</span>
<a name="759" /><span class="Maybe">     759:</span>     <span class="m">enum</span> <span class="b">zone_type</span> <span class="b">classzone_idx</span><span class="f">;</span>
<a name="760" /><span class="False">     760:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_NUMA_BALANCING</span>
<a name="761" /><span class="False">     761:</span>     <span class="k">/*</span>
<a name="762" /><span class="False">     762:</span> <span class="k">     * Lock serializing the per destination node AutoNUMA memory</span>
<a name="763" /><span class="False">     763:</span> <span class="k">     * migration rate limiting data.</span>
<a name="764" /><span class="False">     764:</span> <span class="k">     */</span>
<a name="765" /><span class="False">     765:</span>     <span class="b">spinlock_t</span> <span class="b">numabalancing_migrate_lock</span><span class="f">;</span>
<a name="766" /><span class="False">     766:</span> 
<a name="767" /><span class="False">     767:</span>     <span class="k">/* Rate limiting time interval */</span>
<a name="768" /><span class="False">     768:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">numabalancing_migrate_next_window</span><span class="f">;</span>
<a name="769" /><span class="False">     769:</span> 
<a name="770" /><span class="False">     770:</span>     <span class="k">/* Number of pages migrated during the rate limiting time interval */</span>
<a name="771" /><span class="False">     771:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">numabalancing_migrate_nr_pages</span><span class="f">;</span>
<a name="772" /><span class="Maybe">     772:</span> <span class="f">#</span><span class="n">endif</span>
<a name="773" /><span class="Maybe">     773:</span> <span class="f">}</span> <span class="b">pg_data_t</span><span class="f">;</span>
<a name="774" /><span class="Maybe">     774:</span> 
<a name="775" /><span class="Maybe">     775:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_bm9kZV9wcmVzZW50X3BhZ2VzXzA_"><span class="b">node_present_pages</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span>    <span class="f">(</span><a href="cpu.c_macros_ref.html#_Tk9ERV9EQVRBXzA_"><span class="b">NODE_DATA</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span><span class="f">-&gt;</span><a href="cpu.c_macros_ref.html#_bm9kZV9wcmVzZW50X3BhZ2VzXzA_"><span class="b">node_present_pages</span></a><span class="f">)</span>
<a name="776" /><span class="Maybe">     776:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_bm9kZV9zcGFubmVkX3BhZ2VzXzA_"><span class="b">node_spanned_pages</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span>    <span class="f">(</span><a href="cpu.c_macros_ref.html#_Tk9ERV9EQVRBXzA_"><span class="b">NODE_DATA</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_bm9kZV9zcGFubmVkX3BhZ2VzXzA_"><span class="b">node_spanned_pages</span></a><span class="f">)</span>
<a name="777" /><span class="False">     777:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_FLAT_NODE_MEM_MAP</span>
<a name="778" /><span class="False">     778:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cGdkYXRfcGFnZV9ucl8w"><span class="b">pgdat_page_nr</span></a><span class="f">(</span><span class="b">pgdat</span><span class="f">,</span> <span class="b">pagenr</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="b">pgdat</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">node_mem_map</span> <span class="f">+</span> <span class="f">(</span><span class="b">pagenr</span><span class="f">)</span><span class="f">)</span>
<a name="779" /><span class="Maybe">     779:</span> <span class="f">#</span><span class="n">else</span>
<a name="780" /><span class="Maybe">     780:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cGdkYXRfcGFnZV9ucl8w"><span class="b">pgdat_page_nr</span></a><span class="f">(</span><span class="b">pgdat</span><span class="f">,</span> <span class="b">pagenr</span><span class="f">)</span>    <a href="cpu.c_macros_ref.html#_cGZuX3RvX3BhZ2VfMA__"><span class="b">pfn_to_page</span></a><span class="f">(</span><span class="f">(</span><span class="b">pgdat</span><span class="f">)</span><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_bm9kZV9zdGFydF9wZm5fMA__"><span class="b">node_start_pfn</span></a> <span class="f">+</span> <span class="f">(</span><span class="b">pagenr</span><span class="f">)</span><span class="f">)</span>
<a name="781" /><span class="Maybe">     781:</span> <span class="f">#</span><span class="n">endif</span>
<a name="782" /><span class="Maybe">     782:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_bmlkX3BhZ2VfbnJfMA__"><span class="b">nid_page_nr</span></a><span class="f">(</span><span class="b">nid</span><span class="f">,</span> <span class="b">pagenr</span><span class="f">)</span>     <a href="cpu.c_macros_noref.html#_cGdkYXRfcGFnZV9ucl8w"><span class="b">pgdat_page_nr</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_Tk9ERV9EQVRBXzA_"><span class="b">NODE_DATA</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span><span class="f">,</span><span class="f">(</span><span class="b">pagenr</span><span class="f">)</span><span class="f">)</span>
<a name="783" /><span class="Maybe">     783:</span> 
<a name="784" /><span class="Maybe">     784:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_bm9kZV9zdGFydF9wZm5fMA__"><span class="b">node_start_pfn</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span>    <span class="f">(</span><a href="cpu.c_macros_ref.html#_Tk9ERV9EQVRBXzA_"><span class="b">NODE_DATA</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_bm9kZV9zdGFydF9wZm5fMA__"><span class="b">node_start_pfn</span></a><span class="f">)</span>
<a name="785" /><span class="Maybe">     785:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_bm9kZV9lbmRfcGZuXzA_"><span class="b">node_end_pfn</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span> <span class="b">pgdat_end_pfn</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Tk9ERV9EQVRBXzA_"><span class="b">NODE_DATA</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span><span class="f">)</span>
<a name="786" /><span class="Maybe">     786:</span> 
<a name="787" /><span class="Maybe">     787:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">pgdat_end_pfn</span><span class="f">(</span><span class="b">pg_data_t</span> <span class="f">*</span><span class="b">pgdat</span><span class="f">)</span>
<a name="788" /><span class="Maybe">     788:</span> <span class="f">{</span>
<a name="789" /><span class="Maybe">     789:</span>     <span class="m">return</span> <span class="b">pgdat</span><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_bm9kZV9zdGFydF9wZm5fMA__"><span class="b">node_start_pfn</span></a> <span class="f">+</span> <span class="b">pgdat</span><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_bm9kZV9zcGFubmVkX3BhZ2VzXzA_"><span class="b">node_spanned_pages</span></a><span class="f">;</span>
<a name="790" /><span class="Maybe">     790:</span> <span class="f">}</span>
<a name="791" /><span class="Maybe">     791:</span> 
<a name="792" /><span class="Maybe">     792:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">bool</span> <span class="b">pgdat_is_empty</span><span class="f">(</span><span class="b">pg_data_t</span> <span class="f">*</span><span class="b">pgdat</span><span class="f">)</span>
<a name="793" /><span class="Maybe">     793:</span> <span class="f">{</span>
<a name="794" /><span class="Maybe">     794:</span>     <span class="m">return</span> <span class="f">!</span><span class="b">pgdat</span><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_bm9kZV9zdGFydF9wZm5fMA__"><span class="b">node_start_pfn</span></a> <span class="f">&amp;&amp;</span> <span class="f">!</span><span class="b">pgdat</span><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_bm9kZV9zcGFubmVkX3BhZ2VzXzA_"><span class="b">node_spanned_pages</span></a><span class="f">;</span>
<a name="795" /><span class="Maybe">     795:</span> <span class="f">}</span>
<a name="796" /><span class="Maybe">     796:</span> 
<a name="797" /><span class="Maybe">     797:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">memory_hotplug</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="798" /><span class="Maybe">     798:</span> 
<a name="799" /><span class="Maybe">     799:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">mutex</span> <span class="b">zonelists_mutex</span><span class="f">;</span>
<a name="800" /><span class="Maybe">     800:</span> <span class="m">void</span> <span class="b">build_all_zonelists</span><span class="f">(</span><span class="b">pg_data_t</span> <span class="f">*</span><span class="b">pgdat</span><span class="f">,</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span><span class="f">;</span>
<a name="801" /><span class="Maybe">     801:</span> <span class="m">void</span> <span class="b">wakeup_kswapd</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">,</span> <span class="m">int</span> <span class="b">order</span><span class="f">,</span> <span class="m">enum</span> <span class="b">zone_type</span> <span class="b">classzone_idx</span><span class="f">)</span><span class="f">;</span>
<a name="802" /><span class="Maybe">     802:</span> <span class="m">bool</span> <span class="b">zone_watermark_ok</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">z</span><span class="f">,</span> <span class="m">int</span> <span class="b">order</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">mark</span><span class="f">,</span>
<a name="803" /><span class="Maybe">     803:</span>         <span class="m">int</span> <span class="b">classzone_idx</span><span class="f">,</span> <span class="m">int</span> <span class="b">alloc_flags</span><span class="f">)</span><span class="f">;</span>
<a name="804" /><span class="Maybe">     804:</span> <span class="m">bool</span> <span class="b">zone_watermark_ok_safe</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">z</span><span class="f">,</span> <span class="m">int</span> <span class="b">order</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">mark</span><span class="f">,</span>
<a name="805" /><span class="Maybe">     805:</span>         <span class="m">int</span> <span class="b">classzone_idx</span><span class="f">,</span> <span class="m">int</span> <span class="b">alloc_flags</span><span class="f">)</span><span class="f">;</span>
<a name="806" /><span class="Maybe">     806:</span> <span class="m">enum</span> <span class="b">memmap_context</span> <span class="f">{</span>
<a name="807" /><span class="Maybe">     807:</span>     <span class="b">MEMMAP_EARLY</span><span class="f">,</span>
<a name="808" /><span class="Maybe">     808:</span>     <span class="b">MEMMAP_HOTPLUG</span><span class="f">,</span>
<a name="809" /><span class="Maybe">     809:</span> <span class="f">}</span><span class="f">;</span>
<a name="810" /><span class="Maybe">     810:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">init_currently_empty_zone</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">start_pfn</span><span class="f">,</span>
<a name="811" /><span class="Maybe">     811:</span>                      <span class="m">unsigned</span> <span class="m">long</span> <span class="b">size</span><span class="f">,</span>
<a name="812" /><span class="Maybe">     812:</span>                      <span class="m">enum</span> <span class="b">memmap_context</span> <span class="b">context</span><span class="f">)</span><span class="f">;</span>
<a name="813" /><span class="Maybe">     813:</span> 
<a name="814" /><span class="Maybe">     814:</span> <span class="m">extern</span> <span class="m">void</span> <span class="b">lruvec_init</span><span class="f">(</span><span class="m">struct</span> <span class="b">lruvec</span> <span class="f">*</span><span class="b">lruvec</span><span class="f">)</span><span class="f">;</span>
<a name="815" /><span class="Maybe">     815:</span> 
<a name="816" /><span class="Maybe">     816:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">lruvec_zone</span><span class="f">(</span><span class="m">struct</span> <span class="b">lruvec</span> <span class="f">*</span><span class="b">lruvec</span><span class="f">)</span>
<a name="817" /><span class="Maybe">     817:</span> <span class="f">{</span>
<a name="818" /><span class="False">     818:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_MEMCG</span>
<a name="819" /><span class="False">     819:</span>     <span class="m">return</span> <span class="b">lruvec</span><span class="f">-&gt;</span><span class="b">zone</span><span class="f">;</span>
<a name="820" /><span class="Maybe">     820:</span> <span class="f">#</span><span class="n">else</span>
<a name="821" /><span class="Maybe">     821:</span>     <span class="m">return</span> <a href="cpu.c_macros_ref.html#_Y29udGFpbmVyX29mXzA_"><span class="b">container_of</span></a><span class="f">(</span><span class="b">lruvec</span><span class="f">,</span> <span class="m">struct</span> <span class="b">zone</span><span class="f">,</span> <span class="b">lruvec</span><span class="f">)</span><span class="f">;</span>
<a name="822" /><span class="Maybe">     822:</span> <span class="f">#</span><span class="n">endif</span>
<a name="823" /><span class="Maybe">     823:</span> <span class="f">}</span>
<a name="824" /><span class="Maybe">     824:</span> 
<a name="825" /><span class="Maybe">     825:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlRfMA__"><span class="b">CONFIG_HAVE_MEMORY_PRESENT</span></a>
<a name="826" /><span class="Maybe">     826:</span> <span class="m">void</span> <span class="b">memory_present</span><span class="f">(</span><span class="m">int</span> <span class="b">nid</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">start</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">end</span><span class="f">)</span><span class="f">;</span>
<a name="827" /><span class="False">     827:</span> <span class="f">#</span><span class="n">else</span>
<a name="828" /><span class="False">     828:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">memory_present</span><span class="f">(</span><span class="m">int</span> <span class="b">nid</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">start</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">end</span><span class="f">)</span> <span class="f">{</span><span class="f">}</span>
<a name="829" /><span class="Maybe">     829:</span> <span class="f">#</span><span class="n">endif</span>
<a name="830" /><span class="Maybe">     830:</span> 
<a name="831" /><span class="False">     831:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_HAVE_MEMORYLESS_NODES</span>
<a name="832" /><span class="False">     832:</span> <span class="m">int</span> <span class="b">local_memory_node</span><span class="f">(</span><span class="m">int</span> <span class="b">node_id</span><span class="f">)</span><span class="f">;</span>
<a name="833" /><span class="Maybe">     833:</span> <span class="f">#</span><span class="n">else</span>
<a name="834" /><span class="Maybe">     834:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">local_memory_node</span><span class="f">(</span><span class="m">int</span> <span class="b">node_id</span><span class="f">)</span> <span class="f">{</span> <span class="m">return</span> <span class="b">node_id</span><span class="f">;</span> <span class="f">}</span><span class="f">;</span>
<a name="835" /><span class="Maybe">     835:</span> <span class="f">#</span><span class="n">endif</span>
<a name="836" /><span class="Maybe">     836:</span> 
<a name="837" /><span class="False">     837:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_NEED_NODE_MEMMAP_SIZE</span>
<a name="838" /><span class="False">     838:</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19pbml0XzA_"><span class="b">__init</span></a> <span class="b">node_memmap_size_bytes</span><span class="f">(</span><span class="m">int</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">;</span>
<a name="839" /><span class="Maybe">     839:</span> <span class="f">#</span><span class="n">endif</span>
<a name="840" /><span class="Maybe">     840:</span> 
<a name="841" /><span class="Maybe">     841:</span> <span class="k">/*</span>
<a name="842" /><span class="Maybe">     842:</span> <span class="k"> * zone_idx() returns 0 for the ZONE_DMA zone, 1 for the ZONE_NORMAL zone, etc.</span>
<a name="843" /><span class="Maybe">     843:</span> <span class="k"> */</span>
<a name="844" /><span class="Maybe">     844:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_em9uZV9pZHhfMA__"><span class="b">zone_idx</span></a><span class="f">(</span><span class="b">zone</span><span class="f">)</span>        <span class="f">(</span><span class="f">(</span><span class="b">zone</span><span class="f">)</span> <span class="f">-</span> <span class="f">(</span><span class="b">zone</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">zone_pgdat</span><span class="f">-&gt;</span><span class="b">node_zones</span><span class="f">)</span>
<a name="845" /><span class="Maybe">     845:</span> 
<a name="846" /><span class="Maybe">     846:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">populated_zone</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="847" /><span class="Maybe">     847:</span> <span class="f">{</span>
<a name="848" /><span class="Maybe">     848:</span>     <span class="m">return</span> <span class="f">(</span><span class="f">!</span><span class="f">!</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">present_pages</span><span class="f">)</span><span class="f">;</span>
<a name="849" /><span class="Maybe">     849:</span> <span class="f">}</span>
<a name="850" /><span class="Maybe">     850:</span> 
<a name="851" /><span class="Maybe">     851:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">movable_zone</span><span class="f">;</span>
<a name="852" /><span class="Maybe">     852:</span> 
<a name="853" /><span class="Maybe">     853:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zone_movable_is_highmem</span><span class="f">(</span><span class="m">void</span><span class="f">)</span>
<a name="854" /><span class="Maybe">     854:</span> <span class="f">{</span>
<a name="855" /><span class="False">     855:</span> <span class="f">#</span><span class="n">if</span> <span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_HIGHMEM</span><span class="f">)</span> <span class="f">&amp;&amp;</span> <span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVBfMA__"><span class="b">CONFIG_HAVE_MEMBLOCK_NODE_MAP</span></a><span class="f">)</span>
<a name="856" /><span class="False">     856:</span>     <span class="m">return</span> <span class="b">movable_zone</span> <span class="f">==</span> <span class="b">ZONE_HIGHMEM</span><span class="f">;</span>
<a name="857" /><span class="Maybe">     857:</span> <span class="f">#</span><span class="n">else</span>
<a name="858" /><span class="Maybe">     858:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="859" /><span class="Maybe">     859:</span> <span class="f">#</span><span class="n">endif</span>
<a name="860" /><span class="Maybe">     860:</span> <span class="f">}</span>
<a name="861" /><span class="Maybe">     861:</span> 
<a name="862" /><span class="Maybe">     862:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">is_highmem_idx</span><span class="f">(</span><span class="m">enum</span> <span class="b">zone_type</span> <span class="b">idx</span><span class="f">)</span>
<a name="863" /><span class="Maybe">     863:</span> <span class="f">{</span>
<a name="864" /><span class="False">     864:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_HIGHMEM</span>
<a name="865" /><span class="False">     865:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">idx</span> <span class="f">==</span> <span class="b">ZONE_HIGHMEM</span> <span class="f">||</span>
<a name="866" /><span class="False">     866:</span>         <span class="f">(</span><span class="b">idx</span> <span class="f">==</span> <span class="b">ZONE_MOVABLE</span> <span class="f">&amp;&amp;</span> <span class="b">zone_movable_is_highmem</span><span class="f">(</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="867" /><span class="Maybe">     867:</span> <span class="f">#</span><span class="n">else</span>
<a name="868" /><span class="Maybe">     868:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="869" /><span class="Maybe">     869:</span> <span class="f">#</span><span class="n">endif</span>
<a name="870" /><span class="Maybe">     870:</span> <span class="f">}</span>
<a name="871" /><span class="Maybe">     871:</span> 
<a name="872" /><span class="Maybe">     872:</span> <span class="k">/**</span>
<a name="873" /><span class="Maybe">     873:</span> <span class="k"> * is_highmem - helper function to quickly check if a struct zone is a </span>
<a name="874" /><span class="Maybe">     874:</span> <span class="k"> *              highmem zone or not.  This is an attempt to keep references</span>
<a name="875" /><span class="Maybe">     875:</span> <span class="k"> *              to ZONE_{DMA/NORMAL/HIGHMEM/etc} in general code to a minimum.</span>
<a name="876" /><span class="Maybe">     876:</span> <span class="k"> * @zone - pointer to struct zone variable</span>
<a name="877" /><span class="Maybe">     877:</span> <span class="k"> */</span>
<a name="878" /><span class="Maybe">     878:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">is_highmem</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="879" /><span class="Maybe">     879:</span> <span class="f">{</span>
<a name="880" /><span class="False">     880:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_HIGHMEM</span>
<a name="881" /><span class="False">     881:</span>     <span class="m">int</span> <span class="b">zone_off</span> <span class="f">=</span> <span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="f">)</span><span class="b">zone</span> <span class="f">-</span> <span class="f">(</span><span class="m">char</span> <span class="f">*</span><span class="f">)</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">zone_pgdat</span><span class="f">-&gt;</span><span class="b">node_zones</span><span class="f">;</span>
<a name="882" /><span class="False">     882:</span>     <span class="m">return</span> <span class="b">zone_off</span> <span class="f">==</span> <span class="b">ZONE_HIGHMEM</span> <span class="f">*</span> <span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="b">zone</span><span class="f">)</span> <span class="f">||</span>
<a name="883" /><span class="False">     883:</span>            <span class="f">(</span><span class="b">zone_off</span> <span class="f">==</span> <span class="b">ZONE_MOVABLE</span> <span class="f">*</span> <span class="m">sizeof</span><span class="f">(</span><span class="f">*</span><span class="b">zone</span><span class="f">)</span> <span class="f">&amp;&amp;</span>
<a name="884" /><span class="False">     884:</span>         <span class="b">zone_movable_is_highmem</span><span class="f">(</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="885" /><span class="Maybe">     885:</span> <span class="f">#</span><span class="n">else</span>
<a name="886" /><span class="Maybe">     886:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="887" /><span class="Maybe">     887:</span> <span class="f">#</span><span class="n">endif</span>
<a name="888" /><span class="Maybe">     888:</span> <span class="f">}</span>
<a name="889" /><span class="Maybe">     889:</span> 
<a name="890" /><span class="Maybe">     890:</span> <span class="k">/* These two functions are used to setup the per zone pages min values */</span>
<a name="891" /><span class="Maybe">     891:</span> <span class="m">struct</span> <span class="b">ctl_table</span><span class="f">;</span>
<a name="892" /><span class="Maybe">     892:</span> <span class="m">int</span> <span class="b">min_free_kbytes_sysctl_handler</span><span class="f">(</span><span class="m">struct</span> <span class="b">ctl_table</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">,</span>
<a name="893" /><span class="Maybe">     893:</span>                     <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="f">,</span> <span class="b">size_t</span> <span class="f">*</span><span class="f">,</span> <span class="b">loff_t</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="894" /><span class="Maybe">     894:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">sysctl_lowmem_reserve_ratio</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TUFYX05SX1pPTkVTXzA_"><span class="b">MAX_NR_ZONES</span></a><span class="f">-</span><span class="c">1</span><span class="f">]</span><span class="f">;</span>
<a name="895" /><span class="Maybe">     895:</span> <span class="m">int</span> <span class="b">lowmem_reserve_ratio_sysctl_handler</span><span class="f">(</span><span class="m">struct</span> <span class="b">ctl_table</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">,</span>
<a name="896" /><span class="Maybe">     896:</span>                     <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="f">,</span> <span class="b">size_t</span> <span class="f">*</span><span class="f">,</span> <span class="b">loff_t</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="897" /><span class="Maybe">     897:</span> <span class="m">int</span> <span class="b">percpu_pagelist_fraction_sysctl_handler</span><span class="f">(</span><span class="m">struct</span> <span class="b">ctl_table</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">,</span>
<a name="898" /><span class="Maybe">     898:</span>                     <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="f">,</span> <span class="b">size_t</span> <span class="f">*</span><span class="f">,</span> <span class="b">loff_t</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="899" /><span class="Maybe">     899:</span> <span class="m">int</span> <span class="b">sysctl_min_unmapped_ratio_sysctl_handler</span><span class="f">(</span><span class="m">struct</span> <span class="b">ctl_table</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">,</span>
<a name="900" /><span class="Maybe">     900:</span>             <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="f">,</span> <span class="b">size_t</span> <span class="f">*</span><span class="f">,</span> <span class="b">loff_t</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="901" /><span class="Maybe">     901:</span> <span class="m">int</span> <span class="b">sysctl_min_slab_ratio_sysctl_handler</span><span class="f">(</span><span class="m">struct</span> <span class="b">ctl_table</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">,</span>
<a name="902" /><span class="Maybe">     902:</span>             <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="f">,</span> <span class="b">size_t</span> <span class="f">*</span><span class="f">,</span> <span class="b">loff_t</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="903" /><span class="Maybe">     903:</span> 
<a name="904" /><span class="Maybe">     904:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">numa_zonelist_order_handler</span><span class="f">(</span><span class="m">struct</span> <span class="b">ctl_table</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">,</span>
<a name="905" /><span class="Maybe">     905:</span>             <span class="m">void</span> <a href="cpu.c_macros_ref.html#_X191c2VyXzA_"><span class="b">__user</span></a> <span class="f">*</span><span class="f">,</span> <span class="b">size_t</span> <span class="f">*</span><span class="f">,</span> <span class="b">loff_t</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="906" /><span class="Maybe">     906:</span> <span class="m">extern</span> <span class="m">char</span> <span class="b">numa_zonelist_order</span><span class="f">[</span><span class="f">]</span><span class="f">;</span>
<a name="907" /><span class="Maybe">     907:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_TlVNQV9aT05FTElTVF9PUkRFUl9MRU5fMA__"><span class="b">NUMA_ZONELIST_ORDER_LEN</span></a> <span class="c">16</span>    <span class="k">/* string buffer size */</span>
<a name="908" /><span class="Maybe">     908:</span> 
<a name="909" /><span class="False">     909:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05FRURfTVVMVElQTEVfTk9ERVNfMA__"><span class="b">CONFIG_NEED_MULTIPLE_NODES</span></a>
<a name="910" /><span class="False">     910:</span> 
<a name="911" /><span class="False">     911:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pglist_data</span> <span class="b">contig_page_data</span><span class="f">;</span>
<a name="912" /><span class="False">     912:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_Tk9ERV9EQVRBXzA_"><span class="b">NODE_DATA</span></a><span class="f">(</span><span class="b">nid</span><span class="f">)</span>        <span class="f">(</span><span class="f">&amp;</span><span class="b">contig_page_data</span><span class="f">)</span>
<a name="913" /><span class="False">     913:</span> <span class="f">#</span><span class="n">define</span> <span class="b">NODE_MEM_MAP</span><span class="f">(</span><span class="b">nid</span><span class="f">)</span>    <span class="b">mem_map</span>
<a name="914" /><span class="False">     914:</span> 
<a name="915" /><span class="Maybe">     915:</span> <span class="f">#</span><span class="n">else</span> <span class="k">/* CONFIG_NEED_MULTIPLE_NODES */</span>
<a name="916" /><span class="Maybe">     916:</span> 
<a name="917" /><span class="Maybe">     917:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">mmzone</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="918" /><span class="Maybe">     918:</span> 
<a name="919" /><span class="Maybe">     919:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !CONFIG_NEED_MULTIPLE_NODES */</span>
<a name="920" /><span class="Maybe">     920:</span> 
<a name="921" /><span class="Maybe">     921:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pglist_data</span> <span class="f">*</span><span class="b">first_online_pgdat</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="922" /><span class="Maybe">     922:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">pglist_data</span> <span class="f">*</span><span class="b">next_online_pgdat</span><span class="f">(</span><span class="m">struct</span> <span class="b">pglist_data</span> <span class="f">*</span><span class="b">pgdat</span><span class="f">)</span><span class="f">;</span>
<a name="923" /><span class="Maybe">     923:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">next_zone</span><span class="f">(</span><span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span><span class="f">;</span>
<a name="924" /><span class="Maybe">     924:</span> 
<a name="925" /><span class="Maybe">     925:</span> <span class="k">/**</span>
<a name="926" /><span class="Maybe">     926:</span> <span class="k"> * for_each_online_pgdat - helper macro to iterate over all online nodes</span>
<a name="927" /><span class="Maybe">     927:</span> <span class="k"> * @pgdat - pointer to a pg_data_t variable</span>
<a name="928" /><span class="Maybe">     928:</span> <span class="k"> */</span>
<a name="929" /><span class="Maybe">     929:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfb25saW5lX3BnZGF0XzA_"><span class="b">for_each_online_pgdat</span></a><span class="f">(</span><span class="b">pgdat</span><span class="f">)</span>            \
<a name="930" /><span class="Maybe">     930:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">pgdat</span> <span class="f">=</span> <span class="b">first_online_pgdat</span><span class="f">(</span><span class="f">)</span><span class="f">;</span>        \
<a name="931" /><span class="Maybe">     931:</span>          <span class="b">pgdat</span><span class="f">;</span>                    \
<a name="932" /><span class="Maybe">     932:</span>          <span class="b">pgdat</span> <span class="f">=</span> <span class="b">next_online_pgdat</span><span class="f">(</span><span class="b">pgdat</span><span class="f">)</span><span class="f">)</span>
<a name="933" /><span class="Maybe">     933:</span> <span class="k">/**</span>
<a name="934" /><span class="Maybe">     934:</span> <span class="k"> * for_each_zone - helper macro to iterate over all memory zones</span>
<a name="935" /><span class="Maybe">     935:</span> <span class="k"> * @zone - pointer to struct zone variable</span>
<a name="936" /><span class="Maybe">     936:</span> <span class="k"> *</span>
<a name="937" /><span class="Maybe">     937:</span> <span class="k"> * The user only needs to declare the zone variable, for_each_zone</span>
<a name="938" /><span class="Maybe">     938:</span> <span class="k"> * fills it in.</span>
<a name="939" /><span class="Maybe">     939:</span> <span class="k"> */</span>
<a name="940" /><span class="Maybe">     940:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfem9uZV8w"><span class="b">for_each_zone</span></a><span class="f">(</span><span class="b">zone</span><span class="f">)</span>                    \
<a name="941" /><span class="Maybe">     941:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">zone</span> <span class="f">=</span> <span class="f">(</span><span class="b">first_online_pgdat</span><span class="f">(</span><span class="f">)</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">node_zones</span><span class="f">;</span> \
<a name="942" /><span class="Maybe">     942:</span>          <span class="b">zone</span><span class="f">;</span>                    \
<a name="943" /><span class="Maybe">     943:</span>          <span class="b">zone</span> <span class="f">=</span> <span class="b">next_zone</span><span class="f">(</span><span class="b">zone</span><span class="f">)</span><span class="f">)</span>
<a name="944" /><span class="Maybe">     944:</span> 
<a name="945" /><span class="Maybe">     945:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfcG9wdWxhdGVkX3pvbmVfMA__"><span class="b">for_each_populated_zone</span></a><span class="f">(</span><span class="b">zone</span><span class="f">)</span>                \
<a name="946" /><span class="Maybe">     946:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">zone</span> <span class="f">=</span> <span class="f">(</span><span class="b">first_online_pgdat</span><span class="f">(</span><span class="f">)</span><span class="f">)</span><span class="f">-&gt;</span><span class="b">node_zones</span><span class="f">;</span> \
<a name="947" /><span class="Maybe">     947:</span>          <span class="b">zone</span><span class="f">;</span>                    \
<a name="948" /><span class="Maybe">     948:</span>          <span class="b">zone</span> <span class="f">=</span> <span class="b">next_zone</span><span class="f">(</span><span class="b">zone</span><span class="f">)</span><span class="f">)</span>            \
<a name="949" /><span class="Maybe">     949:</span>         <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="b">populated_zone</span><span class="f">(</span><span class="b">zone</span><span class="f">)</span><span class="f">)</span>        \
<a name="950" /><span class="Maybe">     950:</span>             <span class="f">;</span> <span class="k">/* do nothing */</span>        \
<a name="951" /><span class="Maybe">     951:</span>         <span class="m">else</span>
<a name="952" /><span class="Maybe">     952:</span> 
<a name="953" /><span class="Maybe">     953:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zonelist_zone</span><span class="f">(</span><span class="m">struct</span> <span class="b">zoneref</span> <span class="f">*</span><span class="b">zoneref</span><span class="f">)</span>
<a name="954" /><span class="Maybe">     954:</span> <span class="f">{</span>
<a name="955" /><span class="Maybe">     955:</span>     <span class="m">return</span> <span class="b">zoneref</span><span class="f">-&gt;</span><span class="b">zone</span><span class="f">;</span>
<a name="956" /><span class="Maybe">     956:</span> <span class="f">}</span>
<a name="957" /><span class="Maybe">     957:</span> 
<a name="958" /><span class="Maybe">     958:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zonelist_zone_idx</span><span class="f">(</span><span class="m">struct</span> <span class="b">zoneref</span> <span class="f">*</span><span class="b">zoneref</span><span class="f">)</span>
<a name="959" /><span class="Maybe">     959:</span> <span class="f">{</span>
<a name="960" /><span class="Maybe">     960:</span>     <span class="m">return</span> <span class="b">zoneref</span><span class="f">-&gt;</span><a href="cpu.c_macros_noref.html#_em9uZV9pZHhfMA__"><span class="b">zone_idx</span></a><span class="f">;</span>
<a name="961" /><span class="Maybe">     961:</span> <span class="f">}</span>
<a name="962" /><span class="Maybe">     962:</span> 
<a name="963" /><span class="Maybe">     963:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">zonelist_node_idx</span><span class="f">(</span><span class="m">struct</span> <span class="b">zoneref</span> <span class="f">*</span><span class="b">zoneref</span><span class="f">)</span>
<a name="964" /><span class="Maybe">     964:</span> <span class="f">{</span>
<a name="965" /><span class="Maybe">     965:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05VTUFfMA__"><span class="b">CONFIG_NUMA</span></a>
<a name="966" /><span class="Maybe">     966:</span>     <span class="k">/* zone_to_nid not available in this context */</span>
<a name="967" /><span class="Maybe">     967:</span>     <span class="m">return</span> <span class="b">zoneref</span><span class="f">-&gt;</span><span class="b">zone</span><span class="f">-&gt;</span><span class="b">node</span><span class="f">;</span>
<a name="968" /><span class="False">     968:</span> <span class="f">#</span><span class="n">else</span>
<a name="969" /><span class="False">     969:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="970" /><span class="Maybe">     970:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_NUMA */</span>
<a name="971" /><span class="Maybe">     971:</span> <span class="f">}</span>
<a name="972" /><span class="Maybe">     972:</span> 
<a name="973" /><span class="Maybe">     973:</span> <span class="k">/**</span>
<a name="974" /><span class="Maybe">     974:</span> <span class="k"> * next_zones_zonelist - Returns the next zone at or below highest_zoneidx within the allowed nodemask using a cursor within a zonelist as a starting point</span>
<a name="975" /><span class="Maybe">     975:</span> <span class="k"> * @z - The cursor used as a starting point for the search</span>
<a name="976" /><span class="Maybe">     976:</span> <span class="k"> * @highest_zoneidx - The zone index of the highest zone to return</span>
<a name="977" /><span class="Maybe">     977:</span> <span class="k"> * @nodes - An optional nodemask to filter the zonelist with</span>
<a name="978" /><span class="Maybe">     978:</span> <span class="k"> * @zone - The first suitable zone found is returned via this parameter</span>
<a name="979" /><span class="Maybe">     979:</span> <span class="k"> *</span>
<a name="980" /><span class="Maybe">     980:</span> <span class="k"> * This function returns the next zone at or below a given zone index that is</span>
<a name="981" /><span class="Maybe">     981:</span> <span class="k"> * within the allowed nodemask using a cursor as the starting point for the</span>
<a name="982" /><span class="Maybe">     982:</span> <span class="k"> * search. The zoneref returned is a cursor that represents the current zone</span>
<a name="983" /><span class="Maybe">     983:</span> <span class="k"> * being examined. It should be advanced by one before calling</span>
<a name="984" /><span class="Maybe">     984:</span> <span class="k"> * next_zones_zonelist again.</span>
<a name="985" /><span class="Maybe">     985:</span> <span class="k"> */</span>
<a name="986" /><span class="Maybe">     986:</span> <span class="m">struct</span> <span class="b">zoneref</span> <span class="f">*</span><span class="b">next_zones_zonelist</span><span class="f">(</span><span class="m">struct</span> <span class="b">zoneref</span> <span class="f">*</span><span class="b">z</span><span class="f">,</span>
<a name="987" /><span class="Maybe">     987:</span>                     <span class="m">enum</span> <span class="b">zone_type</span> <span class="b">highest_zoneidx</span><span class="f">,</span>
<a name="988" /><span class="Maybe">     988:</span>                     <span class="b">nodemask_t</span> <span class="f">*</span><span class="b">nodes</span><span class="f">,</span>
<a name="989" /><span class="Maybe">     989:</span>                     <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="f">*</span><span class="b">zone</span><span class="f">)</span><span class="f">;</span>
<a name="990" /><span class="Maybe">     990:</span> 
<a name="991" /><span class="Maybe">     991:</span> <span class="k">/**</span>
<a name="992" /><span class="Maybe">     992:</span> <span class="k"> * first_zones_zonelist - Returns the first zone at or below highest_zoneidx within the allowed nodemask in a zonelist</span>
<a name="993" /><span class="Maybe">     993:</span> <span class="k"> * @zonelist - The zonelist to search for a suitable zone</span>
<a name="994" /><span class="Maybe">     994:</span> <span class="k"> * @highest_zoneidx - The zone index of the highest zone to return</span>
<a name="995" /><span class="Maybe">     995:</span> <span class="k"> * @nodes - An optional nodemask to filter the zonelist with</span>
<a name="996" /><span class="Maybe">     996:</span> <span class="k"> * @zone - The first suitable zone found is returned via this parameter</span>
<a name="997" /><span class="Maybe">     997:</span> <span class="k"> *</span>
<a name="998" /><span class="Maybe">     998:</span> <span class="k"> * This function returns the first zone at or below a given zone index that is</span>
<a name="999" /><span class="Maybe">     999:</span> <span class="k"> * within the allowed nodemask. The zoneref returned is a cursor that can be</span>
<a name="1000" /><span class="Maybe">    1000:</span> <span class="k"> * used to iterate the zonelist with next_zones_zonelist by advancing it by</span>
<a name="1001" /><span class="Maybe">    1001:</span> <span class="k"> * one before calling.</span>
<a name="1002" /><span class="Maybe">    1002:</span> <span class="k"> */</span>
<a name="1003" /><span class="Maybe">    1003:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">zoneref</span> <span class="f">*</span><span class="b">first_zones_zonelist</span><span class="f">(</span><span class="m">struct</span> <span class="b">zonelist</span> <span class="f">*</span><span class="b">zonelist</span><span class="f">,</span>
<a name="1004" /><span class="Maybe">    1004:</span>                     <span class="m">enum</span> <span class="b">zone_type</span> <span class="b">highest_zoneidx</span><span class="f">,</span>
<a name="1005" /><span class="Maybe">    1005:</span>                     <span class="b">nodemask_t</span> <span class="f">*</span><span class="b">nodes</span><span class="f">,</span>
<a name="1006" /><span class="Maybe">    1006:</span>                     <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="1007" /><span class="Maybe">    1007:</span> <span class="f">{</span>
<a name="1008" /><span class="Maybe">    1008:</span>     <span class="m">return</span> <span class="b">next_zones_zonelist</span><span class="f">(</span><span class="b">zonelist</span><span class="f">-&gt;</span><span class="b">_zonerefs</span><span class="f">,</span> <span class="b">highest_zoneidx</span><span class="f">,</span> <span class="b">nodes</span><span class="f">,</span>
<a name="1009" /><span class="Maybe">    1009:</span>                                 <span class="b">zone</span><span class="f">)</span><span class="f">;</span>
<a name="1010" /><span class="Maybe">    1010:</span> <span class="f">}</span>
<a name="1011" /><span class="Maybe">    1011:</span> 
<a name="1012" /><span class="Maybe">    1012:</span> <span class="k">/**</span>
<a name="1013" /><span class="Maybe">    1013:</span> <span class="k"> * for_each_zone_zonelist_nodemask - helper macro to iterate over valid zones in a zonelist at or below a given zone index and within a nodemask</span>
<a name="1014" /><span class="Maybe">    1014:</span> <span class="k"> * @zone - The current zone in the iterator</span>
<a name="1015" /><span class="Maybe">    1015:</span> <span class="k"> * @z - The current pointer within zonelist-&gt;zones being iterated</span>
<a name="1016" /><span class="Maybe">    1016:</span> <span class="k"> * @zlist - The zonelist being iterated</span>
<a name="1017" /><span class="Maybe">    1017:</span> <span class="k"> * @highidx - The zone index of the highest zone to return</span>
<a name="1018" /><span class="Maybe">    1018:</span> <span class="k"> * @nodemask - Nodemask allowed by the allocator</span>
<a name="1019" /><span class="Maybe">    1019:</span> <span class="k"> *</span>
<a name="1020" /><span class="Maybe">    1020:</span> <span class="k"> * This iterator iterates though all zones at or below a given zone index and</span>
<a name="1021" /><span class="Maybe">    1021:</span> <span class="k"> * within a given nodemask</span>
<a name="1022" /><span class="Maybe">    1022:</span> <span class="k"> */</span>
<a name="1023" /><span class="Maybe">    1023:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfem9uZV96b25lbGlzdF9ub2RlbWFza18w"><span class="b">for_each_zone_zonelist_nodemask</span></a><span class="f">(</span><span class="b">zone</span><span class="f">,</span> <span class="b">z</span><span class="f">,</span> <span class="b">zlist</span><span class="f">,</span> <span class="b">highidx</span><span class="f">,</span> <span class="b">nodemask</span><span class="f">)</span> \
<a name="1024" /><span class="Maybe">    1024:</span>     <span class="m">for</span> <span class="f">(</span><span class="b">z</span> <span class="f">=</span> <span class="b">first_zones_zonelist</span><span class="f">(</span><span class="b">zlist</span><span class="f">,</span> <span class="b">highidx</span><span class="f">,</span> <span class="b">nodemask</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">)</span><span class="f">;</span>    \
<a name="1025" /><span class="Maybe">    1025:</span>         <span class="b">zone</span><span class="f">;</span>                            \
<a name="1026" /><span class="Maybe">    1026:</span>         <span class="b">z</span> <span class="f">=</span> <span class="b">next_zones_zonelist</span><span class="f">(</span><span class="f">++</span><span class="b">z</span><span class="f">,</span> <span class="b">highidx</span><span class="f">,</span> <span class="b">nodemask</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">zone</span><span class="f">)</span><span class="f">)</span>    \
<a name="1027" /><span class="Maybe">    1027:</span> 
<a name="1028" /><span class="Maybe">    1028:</span> <span class="k">/**</span>
<a name="1029" /><span class="Maybe">    1029:</span> <span class="k"> * for_each_zone_zonelist - helper macro to iterate over valid zones in a zonelist at or below a given zone index</span>
<a name="1030" /><span class="Maybe">    1030:</span> <span class="k"> * @zone - The current zone in the iterator</span>
<a name="1031" /><span class="Maybe">    1031:</span> <span class="k"> * @z - The current pointer within zonelist-&gt;zones being iterated</span>
<a name="1032" /><span class="Maybe">    1032:</span> <span class="k"> * @zlist - The zonelist being iterated</span>
<a name="1033" /><span class="Maybe">    1033:</span> <span class="k"> * @highidx - The zone index of the highest zone to return</span>
<a name="1034" /><span class="Maybe">    1034:</span> <span class="k"> *</span>
<a name="1035" /><span class="Maybe">    1035:</span> <span class="k"> * This iterator iterates though all zones at or below a given zone index.</span>
<a name="1036" /><span class="Maybe">    1036:</span> <span class="k"> */</span>
<a name="1037" /><span class="Maybe">    1037:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfem9uZV96b25lbGlzdF8w"><span class="b">for_each_zone_zonelist</span></a><span class="f">(</span><span class="b">zone</span><span class="f">,</span> <span class="b">z</span><span class="f">,</span> <span class="b">zlist</span><span class="f">,</span> <span class="b">highidx</span><span class="f">)</span> \
<a name="1038" /><span class="Maybe">    1038:</span>     <a href="cpu.c_macros_noref.html#_Zm9yX2VhY2hfem9uZV96b25lbGlzdF9ub2RlbWFza18w"><span class="b">for_each_zone_zonelist_nodemask</span></a><span class="f">(</span><span class="b">zone</span><span class="f">,</span> <span class="b">z</span><span class="f">,</span> <span class="b">zlist</span><span class="f">,</span> <span class="b">highidx</span><span class="f">,</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">)</span>
<a name="1039" /><span class="Maybe">    1039:</span> 
<a name="1040" /><span class="Maybe">    1040:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NQQVJTRU1FTV8w"><span class="b">CONFIG_SPARSEMEM</span></a>
<a name="1041" /><span class="Maybe">    1041:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="m">asm</span><span class="f">/</span><span class="b">sparsemem</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="1042" /><span class="Maybe">    1042:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1043" /><span class="Maybe">    1043:</span> 
<a name="1044" /><span class="False">    1044:</span> <span class="f">#</span><span class="n">if</span> <span class="f">!</span><span class="b">defined</span><span class="f">(</span><span class="b">CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID</span><span class="f">)</span> <span class="f">&amp;&amp;</span> \
<a name="1045" /><span class="False">    1045:</span>     <span class="f">!</span><span class="b">defined</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_Q09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVBfMA__"><span class="b">CONFIG_HAVE_MEMBLOCK_NODE_MAP</span></a><span class="f">)</span>
<a name="1046" /><span class="False">    1046:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">early_pfn_to_nid</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">pfn</span><span class="f">)</span>
<a name="1047" /><span class="False">    1047:</span> <span class="f">{</span>
<a name="1048" /><span class="False">    1048:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="1049" /><span class="False">    1049:</span> <span class="f">}</span>
<a name="1050" /><span class="Maybe">    1050:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1051" /><span class="Maybe">    1051:</span> 
<a name="1052" /><span class="False">    1052:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_FLATMEM</span>
<a name="1053" /><span class="False">    1053:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cGZuX3RvX25pZF8w"><span class="b">pfn_to_nid</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>        <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="1054" /><span class="Maybe">    1054:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1055" /><span class="Maybe">    1055:</span> 
<a name="1056" /><span class="Maybe">    1056:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NQQVJTRU1FTV8w"><span class="b">CONFIG_SPARSEMEM</span></a>
<a name="1057" /><span class="Maybe">    1057:</span> 
<a name="1058" /><span class="Maybe">    1058:</span> <span class="k">/*</span>
<a name="1059" /><span class="Maybe">    1059:</span> <span class="k"> * SECTION_SHIFT            #bits space required to store a section #</span>
<a name="1060" /><span class="Maybe">    1060:</span> <span class="k"> *</span>
<a name="1061" /><span class="Maybe">    1061:</span> <span class="k"> * PA_SECTION_SHIFT        physical address to/from section number</span>
<a name="1062" /><span class="Maybe">    1062:</span> <span class="k"> * PFN_SECTION_SHIFT        pfn to/from section number</span>
<a name="1063" /><span class="Maybe">    1063:</span> <span class="k"> */</span>
<a name="1064" /><span class="Maybe">    1064:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UEFfU0VDVElPTl9TSElGVF8w"><span class="b">PA_SECTION_SHIFT</span></a>    <span class="f">(</span><a href="cpu.c_macros_ref.html#_U0VDVElPTl9TSVpFX0JJVFNfMA__"><span class="b">SECTION_SIZE_BITS</span></a><span class="f">)</span>
<a name="1065" /><span class="Maybe">    1065:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_UEZOX1NFQ1RJT05fU0hJRlRfMA__"><span class="b">PFN_SECTION_SHIFT</span></a>    <span class="f">(</span><a href="cpu.c_macros_ref.html#_U0VDVElPTl9TSVpFX0JJVFNfMA__"><span class="b">SECTION_SIZE_BITS</span></a> <span class="f">-</span> <a href="cpu.c_macros_ref.html#_UEFHRV9TSElGVF8w"><span class="b">PAGE_SHIFT</span></a><span class="f">)</span>
<a name="1066" /><span class="Maybe">    1066:</span> 
<a name="1067" /><span class="Maybe">    1067:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TlJfTUVNX1NFQ1RJT05TXzA_"><span class="b">NR_MEM_SECTIONS</span></a>        <span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTlNfU0hJRlRfMA__"><span class="b">SECTIONS_SHIFT</span></a><span class="f">)</span>
<a name="1068" /><span class="Maybe">    1068:</span> 
<a name="1069" /><span class="Maybe">    1069:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UEFHRVNfUEVSX1NFQ1RJT05fMA__"><span class="b">PAGES_PER_SECTION</span></a>       <span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <a href="cpu.c_macros_ref.html#_UEZOX1NFQ1RJT05fU0hJRlRfMA__"><span class="b">PFN_SECTION_SHIFT</span></a><span class="f">)</span>
<a name="1070" /><span class="Maybe">    1070:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_UEFHRV9TRUNUSU9OX01BU0tfMA__"><span class="b">PAGE_SECTION_MASK</span></a>    <span class="f">(</span><span class="f">~</span><span class="f">(</span><a href="cpu.c_macros_noref.html#_UEFHRVNfUEVSX1NFQ1RJT05fMA__"><span class="b">PAGES_PER_SECTION</span></a><span class="f">-</span><span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="1071" /><span class="Maybe">    1071:</span> 
<a name="1072" /><span class="Maybe">    1072:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U0VDVElPTl9CTE9DS0ZMQUdTX0JJVFNfMA__"><span class="b">SECTION_BLOCKFLAGS_BITS</span></a> \
<a name="1073" /><span class="Maybe">    1073:</span>     <span class="f">(</span><span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_UEZOX1NFQ1RJT05fU0hJRlRfMA__"><span class="b">PFN_SECTION_SHIFT</span></a> <span class="f">-</span> <a href="cpu.c_macros_noref.html#_cGFnZWJsb2NrX29yZGVyXzA_"><span class="b">pageblock_order</span></a><span class="f">)</span><span class="f">)</span> <span class="f">*</span> <span class="b">NR_PAGEBLOCK_BITS</span><span class="f">)</span>
<a name="1074" /><span class="Maybe">    1074:</span> 
<a name="1075" /><span class="False">    1075:</span> <span class="f">#</span><span class="n">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_TUFYX09SREVSXzA_"><span class="b">MAX_ORDER</span></a> <span class="f">-</span> <span class="c">1</span> <span class="f">+</span> <a href="cpu.c_macros_ref.html#_UEFHRV9TSElGVF8w"><span class="b">PAGE_SHIFT</span></a><span class="f">)</span> <span class="f">&gt;</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9TSVpFX0JJVFNfMA__"><span class="b">SECTION_SIZE_BITS</span></a>
<a name="1076" /><span class="False">    1076:</span> <span class="f">#</span><span class="n">error</span> <span class="b">Allocator</span> <a href="cpu.c_macros_ref.html#_TUFYX09SREVSXzA_"><span class="b">MAX_ORDER</span></a> <span class="b">exceeds</span> <span class="b">SECTION_SIZE</span>
<a name="1077" /><span class="Maybe">    1077:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1078" /><span class="Maybe">    1078:</span> 
<a name="1079" /><span class="Maybe">    1079:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_cGZuX3RvX3NlY3Rpb25fbnJfMA__"><span class="b">pfn_to_section_nr</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span> <span class="f">(</span><span class="f">(</span><span class="b">pfn</span><span class="f">)</span> <span class="f">&gt;&gt;</span> <a href="cpu.c_macros_ref.html#_UEZOX1NFQ1RJT05fU0hJRlRfMA__"><span class="b">PFN_SECTION_SHIFT</span></a><span class="f">)</span>
<a name="1080" /><span class="Maybe">    1080:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_c2VjdGlvbl9ucl90b19wZm5fMA__"><span class="b">section_nr_to_pfn</span></a><span class="f">(</span><span class="b">sec</span><span class="f">)</span> <span class="f">(</span><span class="f">(</span><span class="b">sec</span><span class="f">)</span> <span class="f">&lt;&lt;</span> <a href="cpu.c_macros_ref.html#_UEZOX1NFQ1RJT05fU0hJRlRfMA__"><span class="b">PFN_SECTION_SHIFT</span></a><span class="f">)</span>
<a name="1081" /><span class="Maybe">    1081:</span> 
<a name="1082" /><span class="Maybe">    1082:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U0VDVElPTl9BTElHTl9VUF8w"><span class="b">SECTION_ALIGN_UP</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="f">(</span><span class="b">pfn</span><span class="f">)</span> <span class="f">+</span> <a href="cpu.c_macros_noref.html#_UEFHRVNfUEVSX1NFQ1RJT05fMA__"><span class="b">PAGES_PER_SECTION</span></a> <span class="f">-</span> <span class="c">1</span><span class="f">)</span> <span class="f">&amp;</span> <a href="cpu.c_macros_noref.html#_UEFHRV9TRUNUSU9OX01BU0tfMA__"><span class="b">PAGE_SECTION_MASK</span></a><span class="f">)</span>
<a name="1083" /><span class="Maybe">    1083:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U0VDVElPTl9BTElHTl9ET1dOXzA_"><span class="b">SECTION_ALIGN_DOWN</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="b">pfn</span><span class="f">)</span> <span class="f">&amp;</span> <a href="cpu.c_macros_noref.html#_UEFHRV9TRUNUSU9OX01BU0tfMA__"><span class="b">PAGE_SECTION_MASK</span></a><span class="f">)</span>
<a name="1084" /><span class="Maybe">    1084:</span> 
<a name="1085" /><span class="Maybe">    1085:</span> <span class="m">struct</span> <span class="b">page</span><span class="f">;</span>
<a name="1086" /><span class="Maybe">    1086:</span> <span class="m">struct</span> <span class="b">page_cgroup</span><span class="f">;</span>
<a name="1087" /><span class="Maybe">    1087:</span> <span class="m">struct</span> <span class="b">mem_section</span> <span class="f">{</span>
<a name="1088" /><span class="Maybe">    1088:</span>     <span class="k">/*</span>
<a name="1089" /><span class="Maybe">    1089:</span> <span class="k">     * This is, logically, a pointer to an array of struct</span>
<a name="1090" /><span class="Maybe">    1090:</span> <span class="k">     * pages.  However, it is stored with some other magic.</span>
<a name="1091" /><span class="Maybe">    1091:</span> <span class="k">     * (see sparse.c::sparse_init_one_section())</span>
<a name="1092" /><span class="Maybe">    1092:</span> <span class="k">     *</span>
<a name="1093" /><span class="Maybe">    1093:</span> <span class="k">     * Additionally during early boot we encode node id of</span>
<a name="1094" /><span class="Maybe">    1094:</span> <span class="k">     * the location of the section here to guide allocation.</span>
<a name="1095" /><span class="Maybe">    1095:</span> <span class="k">     * (see sparse.c::memory_present())</span>
<a name="1096" /><span class="Maybe">    1096:</span> <span class="k">     *</span>
<a name="1097" /><span class="Maybe">    1097:</span> <span class="k">     * Making it a UL at least makes someone do a cast</span>
<a name="1098" /><span class="Maybe">    1098:</span> <span class="k">     * before using it wrong.</span>
<a name="1099" /><span class="Maybe">    1099:</span> <span class="k">     */</span>
<a name="1100" /><span class="Maybe">    1100:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">section_mem_map</span><span class="f">;</span>
<a name="1101" /><span class="Maybe">    1101:</span> 
<a name="1102" /><span class="Maybe">    1102:</span>     <span class="k">/* See declaration of similar field in struct zone */</span>
<a name="1103" /><span class="Maybe">    1103:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="f">*</span><span class="b">pageblock_flags</span><span class="f">;</span>
<a name="1104" /><span class="False">    1104:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_MEMCG</span>
<a name="1105" /><span class="False">    1105:</span>     <span class="k">/*</span>
<a name="1106" /><span class="False">    1106:</span> <span class="k">     * If !SPARSEMEM, pgdat doesn&apos;t have page_cgroup pointer. We use</span>
<a name="1107" /><span class="False">    1107:</span> <span class="k">     * section. (see memcontrol.h/page_cgroup.h about this.)</span>
<a name="1108" /><span class="False">    1108:</span> <span class="k">     */</span>
<a name="1109" /><span class="False">    1109:</span>     <span class="m">struct</span> <span class="b">page_cgroup</span> <span class="f">*</span><span class="b">page_cgroup</span><span class="f">;</span>
<a name="1110" /><span class="False">    1110:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">pad</span><span class="f">;</span>
<a name="1111" /><span class="Maybe">    1111:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1112" /><span class="Maybe">    1112:</span>     <span class="k">/*</span>
<a name="1113" /><span class="Maybe">    1113:</span> <span class="k">     * WARNING: mem_section must be a power-of-2 in size for the</span>
<a name="1114" /><span class="Maybe">    1114:</span> <span class="k">     * calculation and use of SECTION_ROOT_MASK to make sense.</span>
<a name="1115" /><span class="Maybe">    1115:</span> <span class="k">     */</span>
<a name="1116" /><span class="Maybe">    1116:</span> <span class="f">}</span><span class="f">;</span>
<a name="1117" /><span class="Maybe">    1117:</span> 
<a name="1118" /><span class="Maybe">    1118:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NQQVJTRU1FTV9FWFRSRU1FXzA_"><span class="b">CONFIG_SPARSEMEM_EXTREME</span></a>
<a name="1119" /><span class="Maybe">    1119:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTlNfUEVSX1JPT1RfMA__"><span class="b">SECTIONS_PER_ROOT</span></a>       <span class="f">(</span><a href="cpu.c_macros_ref.html#_UEFHRV9TSVpFXzA_"><span class="b">PAGE_SIZE</span></a> <span class="f">/</span> <span class="m">sizeof</span> <span class="f">(</span><span class="m">struct</span> <span class="b">mem_section</span><span class="f">)</span><span class="f">)</span>
<a name="1120" /><span class="False">    1120:</span> <span class="f">#</span><span class="n">else</span>
<a name="1121" /><span class="False">    1121:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTlNfUEVSX1JPT1RfMA__"><span class="b">SECTIONS_PER_ROOT</span></a>    <span class="c">1</span>
<a name="1122" /><span class="Maybe">    1122:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1123" /><span class="Maybe">    1123:</span> 
<a name="1124" /><span class="Maybe">    1124:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9OUl9UT19ST09UXzA_"><span class="b">SECTION_NR_TO_ROOT</span></a><span class="f">(</span><span class="b">sec</span><span class="f">)</span>    <span class="f">(</span><span class="f">(</span><span class="b">sec</span><span class="f">)</span> <span class="f">/</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTlNfUEVSX1JPT1RfMA__"><span class="b">SECTIONS_PER_ROOT</span></a><span class="f">)</span>
<a name="1125" /><span class="Maybe">    1125:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_TlJfU0VDVElPTl9ST09UU18w"><span class="b">NR_SECTION_ROOTS</span></a>    <a href="cpu.c_macros_ref.html#_RElWX1JPVU5EX1VQXzA_"><span class="b">DIV_ROUND_UP</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_TlJfTUVNX1NFQ1RJT05TXzA_"><span class="b">NR_MEM_SECTIONS</span></a><span class="f">,</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTlNfUEVSX1JPT1RfMA__"><span class="b">SECTIONS_PER_ROOT</span></a><span class="f">)</span>
<a name="1126" /><span class="Maybe">    1126:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9ST09UX01BU0tfMA__"><span class="b">SECTION_ROOT_MASK</span></a>    <span class="f">(</span><a href="cpu.c_macros_ref.html#_U0VDVElPTlNfUEVSX1JPT1RfMA__"><span class="b">SECTIONS_PER_ROOT</span></a> <span class="f">-</span> <span class="c">1</span><span class="f">)</span>
<a name="1127" /><span class="Maybe">    1127:</span> 
<a name="1128" /><span class="Maybe">    1128:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX1NQQVJTRU1FTV9FWFRSRU1FXzA_"><span class="b">CONFIG_SPARSEMEM_EXTREME</span></a>
<a name="1129" /><span class="Maybe">    1129:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">mem_section</span> <span class="f">*</span><span class="b">mem_section</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TlJfU0VDVElPTl9ST09UU18w"><span class="b">NR_SECTION_ROOTS</span></a><span class="f">]</span><span class="f">;</span>
<a name="1130" /><span class="False">    1130:</span> <span class="f">#</span><span class="n">else</span>
<a name="1131" /><span class="False">    1131:</span> <span class="m">extern</span> <span class="m">struct</span> <span class="b">mem_section</span> <span class="b">mem_section</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_TlJfU0VDVElPTl9ST09UU18w"><span class="b">NR_SECTION_ROOTS</span></a><span class="f">]</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_U0VDVElPTlNfUEVSX1JPT1RfMA__"><span class="b">SECTIONS_PER_ROOT</span></a><span class="f">]</span><span class="f">;</span>
<a name="1132" /><span class="Maybe">    1132:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1133" /><span class="Maybe">    1133:</span> 
<a name="1134" /><span class="Maybe">    1134:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">mem_section</span> <span class="f">*</span><span class="b">__nr_to_section</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">nr</span><span class="f">)</span>
<a name="1135" /><span class="Maybe">    1135:</span> <span class="f">{</span>
<a name="1136" /><span class="Maybe">    1136:</span>     <span class="m">if</span> <span class="f">(</span><span class="f">!</span><span class="b">mem_section</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_U0VDVElPTl9OUl9UT19ST09UXzA_"><span class="b">SECTION_NR_TO_ROOT</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span><span class="f">]</span><span class="f">)</span>
<a name="1137" /><span class="Maybe">    1137:</span>         <span class="m">return</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">;</span>
<a name="1138" /><span class="Maybe">    1138:</span>     <span class="m">return</span> <span class="f">&amp;</span><span class="b">mem_section</span><span class="f">[</span><a href="cpu.c_macros_ref.html#_U0VDVElPTl9OUl9UT19ST09UXzA_"><span class="b">SECTION_NR_TO_ROOT</span></a><span class="f">(</span><span class="b">nr</span><span class="f">)</span><span class="f">]</span><span class="f">[</span><span class="b">nr</span> <span class="f">&amp;</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9ST09UX01BU0tfMA__"><span class="b">SECTION_ROOT_MASK</span></a><span class="f">]</span><span class="f">;</span>
<a name="1139" /><span class="Maybe">    1139:</span> <span class="f">}</span>
<a name="1140" /><span class="Maybe">    1140:</span> <span class="m">extern</span> <span class="m">int</span> <span class="b">__section_nr</span><span class="f">(</span><span class="m">struct</span> <span class="b">mem_section</span><span class="f">*</span> <span class="b">ms</span><span class="f">)</span><span class="f">;</span>
<a name="1141" /><span class="Maybe">    1141:</span> <span class="m">extern</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">usemap_size</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="1142" /><span class="Maybe">    1142:</span> 
<a name="1143" /><span class="Maybe">    1143:</span> <span class="k">/*</span>
<a name="1144" /><span class="Maybe">    1144:</span> <span class="k"> * We use the lower bits of the mem_map pointer to store</span>
<a name="1145" /><span class="Maybe">    1145:</span> <span class="k"> * a little bit of information.  There should be at least</span>
<a name="1146" /><span class="Maybe">    1146:</span> <span class="k"> * 3 bits here due to 32-bit alignment.</span>
<a name="1147" /><span class="Maybe">    1147:</span> <span class="k"> */</span>
<a name="1148" /><span class="Maybe">    1148:</span> <span class="f">#</span><span class="n">define</span>    <a href="cpu.c_macros_ref.html#_U0VDVElPTl9NQVJLRURfUFJFU0VOVF8w"><span class="b">SECTION_MARKED_PRESENT</span></a>    <span class="f">(</span><span class="c">1UL</span><span class="f">&lt;&lt;</span><span class="c">0</span><span class="f">)</span>
<a name="1149" /><span class="Maybe">    1149:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9IQVNfTUVNX01BUF8w"><span class="b">SECTION_HAS_MEM_MAP</span></a>    <span class="f">(</span><span class="c">1UL</span><span class="f">&lt;&lt;</span><span class="c">1</span><span class="f">)</span>
<a name="1150" /><span class="Maybe">    1150:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9NQVBfTEFTVF9CSVRfMA__"><span class="b">SECTION_MAP_LAST_BIT</span></a>    <span class="f">(</span><span class="c">1UL</span><span class="f">&lt;&lt;</span><span class="c">2</span><span class="f">)</span>
<a name="1151" /><span class="Maybe">    1151:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9NQVBfTUFTS18w"><span class="b">SECTION_MAP_MASK</span></a>    <span class="f">(</span><span class="f">~</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_U0VDVElPTl9NQVBfTEFTVF9CSVRfMA__"><span class="b">SECTION_MAP_LAST_BIT</span></a><span class="f">-</span><span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="1152" /><span class="Maybe">    1152:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_U0VDVElPTl9OSURfU0hJRlRfMA__"><span class="b">SECTION_NID_SHIFT</span></a>    <span class="c">2</span>
<a name="1153" /><span class="Maybe">    1153:</span> 
<a name="1154" /><span class="Maybe">    1154:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="b">__section_mem_map_addr</span><span class="f">(</span><span class="m">struct</span> <span class="b">mem_section</span> <span class="f">*</span><span class="b">section</span><span class="f">)</span>
<a name="1155" /><span class="Maybe">    1155:</span> <span class="f">{</span>
<a name="1156" /><span class="Maybe">    1156:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">map</span> <span class="f">=</span> <span class="b">section</span><span class="f">-&gt;</span><span class="b">section_mem_map</span><span class="f">;</span>
<a name="1157" /><span class="Maybe">    1157:</span>     <span class="b">map</span> <span class="f">&amp;=</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9NQVBfTUFTS18w"><span class="b">SECTION_MAP_MASK</span></a><span class="f">;</span>
<a name="1158" /><span class="Maybe">    1158:</span>     <span class="m">return</span> <span class="f">(</span><span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="f">)</span><span class="b">map</span><span class="f">;</span>
<a name="1159" /><span class="Maybe">    1159:</span> <span class="f">}</span>
<a name="1160" /><span class="Maybe">    1160:</span> 
<a name="1161" /><span class="Maybe">    1161:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">present_section</span><span class="f">(</span><span class="m">struct</span> <span class="b">mem_section</span> <span class="f">*</span><span class="b">section</span><span class="f">)</span>
<a name="1162" /><span class="Maybe">    1162:</span> <span class="f">{</span>
<a name="1163" /><span class="Maybe">    1163:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">section</span> <span class="f">&amp;&amp;</span> <span class="f">(</span><span class="b">section</span><span class="f">-&gt;</span><span class="b">section_mem_map</span> <span class="f">&amp;</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9NQVJLRURfUFJFU0VOVF8w"><span class="b">SECTION_MARKED_PRESENT</span></a><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="1164" /><span class="Maybe">    1164:</span> <span class="f">}</span>
<a name="1165" /><span class="Maybe">    1165:</span> 
<a name="1166" /><span class="Maybe">    1166:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">present_section_nr</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">nr</span><span class="f">)</span>
<a name="1167" /><span class="Maybe">    1167:</span> <span class="f">{</span>
<a name="1168" /><span class="Maybe">    1168:</span>     <span class="m">return</span> <span class="b">present_section</span><span class="f">(</span><span class="b">__nr_to_section</span><span class="f">(</span><span class="b">nr</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="1169" /><span class="Maybe">    1169:</span> <span class="f">}</span>
<a name="1170" /><span class="Maybe">    1170:</span> 
<a name="1171" /><span class="Maybe">    1171:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">valid_section</span><span class="f">(</span><span class="m">struct</span> <span class="b">mem_section</span> <span class="f">*</span><span class="b">section</span><span class="f">)</span>
<a name="1172" /><span class="Maybe">    1172:</span> <span class="f">{</span>
<a name="1173" /><span class="Maybe">    1173:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">section</span> <span class="f">&amp;&amp;</span> <span class="f">(</span><span class="b">section</span><span class="f">-&gt;</span><span class="b">section_mem_map</span> <span class="f">&amp;</span> <a href="cpu.c_macros_ref.html#_U0VDVElPTl9IQVNfTUVNX01BUF8w"><span class="b">SECTION_HAS_MEM_MAP</span></a><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="1174" /><span class="Maybe">    1174:</span> <span class="f">}</span>
<a name="1175" /><span class="Maybe">    1175:</span> 
<a name="1176" /><span class="Maybe">    1176:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">valid_section_nr</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">nr</span><span class="f">)</span>
<a name="1177" /><span class="Maybe">    1177:</span> <span class="f">{</span>
<a name="1178" /><span class="Maybe">    1178:</span>     <span class="m">return</span> <span class="b">valid_section</span><span class="f">(</span><span class="b">__nr_to_section</span><span class="f">(</span><span class="b">nr</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="1179" /><span class="Maybe">    1179:</span> <span class="f">}</span>
<a name="1180" /><span class="Maybe">    1180:</span> 
<a name="1181" /><span class="Maybe">    1181:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">struct</span> <span class="b">mem_section</span> <span class="f">*</span><span class="b">__pfn_to_section</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">pfn</span><span class="f">)</span>
<a name="1182" /><span class="Maybe">    1182:</span> <span class="f">{</span>
<a name="1183" /><span class="Maybe">    1183:</span>     <span class="m">return</span> <span class="b">__nr_to_section</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_cGZuX3RvX3NlY3Rpb25fbnJfMA__"><span class="b">pfn_to_section_nr</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="1184" /><span class="Maybe">    1184:</span> <span class="f">}</span>
<a name="1185" /><span class="Maybe">    1185:</span> 
<a name="1186" /><span class="Maybe">    1186:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">CONFIG_HAVE_ARCH_PFN_VALID</span>
<a name="1187" /><span class="Maybe">    1187:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">pfn_valid</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">pfn</span><span class="f">)</span>
<a name="1188" /><span class="Maybe">    1188:</span> <span class="f">{</span>
<a name="1189" /><span class="Maybe">    1189:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_cGZuX3RvX3NlY3Rpb25fbnJfMA__"><span class="b">pfn_to_section_nr</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span> <span class="f">&gt;=</span> <a href="cpu.c_macros_ref.html#_TlJfTUVNX1NFQ1RJT05TXzA_"><span class="b">NR_MEM_SECTIONS</span></a><span class="f">)</span>
<a name="1190" /><span class="Maybe">    1190:</span>         <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="1191" /><span class="Maybe">    1191:</span>     <span class="m">return</span> <span class="b">valid_section</span><span class="f">(</span><span class="b">__nr_to_section</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_cGZuX3RvX3NlY3Rpb25fbnJfMA__"><span class="b">pfn_to_section_nr</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="1192" /><span class="Maybe">    1192:</span> <span class="f">}</span>
<a name="1193" /><span class="Maybe">    1193:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1194" /><span class="Maybe">    1194:</span> 
<a name="1195" /><span class="Maybe">    1195:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">pfn_present</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">pfn</span><span class="f">)</span>
<a name="1196" /><span class="Maybe">    1196:</span> <span class="f">{</span>
<a name="1197" /><span class="Maybe">    1197:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_cGZuX3RvX3NlY3Rpb25fbnJfMA__"><span class="b">pfn_to_section_nr</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span> <span class="f">&gt;=</span> <a href="cpu.c_macros_ref.html#_TlJfTUVNX1NFQ1RJT05TXzA_"><span class="b">NR_MEM_SECTIONS</span></a><span class="f">)</span>
<a name="1198" /><span class="Maybe">    1198:</span>         <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="1199" /><span class="Maybe">    1199:</span>     <span class="m">return</span> <span class="b">present_section</span><span class="f">(</span><span class="b">__nr_to_section</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_cGZuX3RvX3NlY3Rpb25fbnJfMA__"><span class="b">pfn_to_section_nr</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="1200" /><span class="Maybe">    1200:</span> <span class="f">}</span>
<a name="1201" /><span class="Maybe">    1201:</span> 
<a name="1202" /><span class="Maybe">    1202:</span> <span class="k">/*</span>
<a name="1203" /><span class="Maybe">    1203:</span> <span class="k"> * These are _only_ used during initialisation, therefore they</span>
<a name="1204" /><span class="Maybe">    1204:</span> <span class="k"> * can use __initdata ...  They could have names to indicate</span>
<a name="1205" /><span class="Maybe">    1205:</span> <span class="k"> * this restriction.</span>
<a name="1206" /><span class="Maybe">    1206:</span> <span class="k"> */</span>
<a name="1207" /><span class="Maybe">    1207:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05VTUFfMA__"><span class="b">CONFIG_NUMA</span></a>
<a name="1208" /><span class="Maybe">    1208:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cGZuX3RvX25pZF8w"><span class="b">pfn_to_nid</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>                            \
<a name="1209" /><span class="Maybe">    1209:</span> <span class="f">(</span><span class="f">{</span>                                    \
<a name="1210" /><span class="Maybe">    1210:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">__pfn_to_nid_pfn</span> <span class="f">=</span> <span class="f">(</span><span class="b">pfn</span><span class="f">)</span><span class="f">;</span>                \
<a name="1211" /><span class="Maybe">    1211:</span>     <span class="b">page_to_nid</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_cGZuX3RvX3BhZ2VfMA__"><span class="b">pfn_to_page</span></a><span class="f">(</span><span class="b">__pfn_to_nid_pfn</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>            \
<a name="1212" /><span class="Maybe">    1212:</span> <span class="f">}</span><span class="f">)</span>
<a name="1213" /><span class="False">    1213:</span> <span class="f">#</span><span class="n">else</span>
<a name="1214" /><span class="False">    1214:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cGZuX3RvX25pZF8w"><span class="b">pfn_to_nid</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>        <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="1215" /><span class="Maybe">    1215:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1216" /><span class="Maybe">    1216:</span> 
<a name="1217" /><span class="Maybe">    1217:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_ZWFybHlfcGZuX3ZhbGlkXzA_"><span class="b">early_pfn_valid</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>    <span class="b">pfn_valid</span><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>
<a name="1218" /><span class="Maybe">    1218:</span> <span class="m">void</span> <span class="b">sparse_init</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="1219" /><span class="False">    1219:</span> <span class="f">#</span><span class="n">else</span>
<a name="1220" /><span class="False">    1220:</span> <span class="f">#</span><span class="n">define</span> <span class="b">sparse_init</span><span class="f">(</span><span class="f">)</span>    <span class="m">do</span> <span class="f">{</span><span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="1221" /><span class="False">    1221:</span> <span class="f">#</span><span class="n">define</span> <span class="b">sparse_index_init</span><span class="f">(</span><span class="b">_sec</span><span class="f">,</span> <span class="b">_nid</span><span class="f">)</span>  <span class="m">do</span> <span class="f">{</span><span class="f">}</span> <span class="m">while</span> <span class="f">(</span><span class="c">0</span><span class="f">)</span>
<a name="1222" /><span class="Maybe">    1222:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_SPARSEMEM */</span>
<a name="1223" /><span class="Maybe">    1223:</span> 
<a name="1224" /><span class="Maybe">    1224:</span> <span class="f">#</span><span class="n">ifdef</span> <a href="cpu.c_macros_ref.html#_Q09ORklHX05PREVTX1NQQU5fT1RIRVJfTk9ERVNfMA__"><span class="b">CONFIG_NODES_SPAN_OTHER_NODES</span></a>
<a name="1225" /><span class="Maybe">    1225:</span> <span class="m">bool</span> <span class="b">early_pfn_in_nid</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">pfn</span><span class="f">,</span> <span class="m">int</span> <span class="b">nid</span><span class="f">)</span><span class="f">;</span>
<a name="1226" /><span class="False">    1226:</span> <span class="f">#</span><span class="n">else</span>
<a name="1227" /><span class="False">    1227:</span> <span class="f">#</span><span class="n">define</span> <span class="b">early_pfn_in_nid</span><span class="f">(</span><span class="b">pfn</span><span class="f">,</span> <span class="b">nid</span><span class="f">)</span>    <span class="f">(</span><span class="c">1</span><span class="f">)</span>
<a name="1228" /><span class="Maybe">    1228:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1229" /><span class="Maybe">    1229:</span> 
<a name="1230" /><span class="False">    1230:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_ZWFybHlfcGZuX3ZhbGlkXzA_"><span class="b">early_pfn_valid</span></a>
<a name="1231" /><span class="False">    1231:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_ZWFybHlfcGZuX3ZhbGlkXzA_"><span class="b">early_pfn_valid</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>    <span class="f">(</span><span class="c">1</span><span class="f">)</span>
<a name="1232" /><span class="Maybe">    1232:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1233" /><span class="Maybe">    1233:</span> 
<a name="1234" /><span class="Maybe">    1234:</span> <span class="m">void</span> <span class="b">memory_present</span><span class="f">(</span><span class="m">int</span> <span class="b">nid</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">start</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">end</span><span class="f">)</span><span class="f">;</span>
<a name="1235" /><span class="Maybe">    1235:</span> <span class="m">unsigned</span> <span class="m">long</span> <a href="cpu.c_macros_ref.html#_X19pbml0XzA_"><span class="b">__init</span></a> <span class="b">node_memmap_size_bytes</span><span class="f">(</span><span class="m">int</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">long</span><span class="f">)</span><span class="f">;</span>
<a name="1236" /><span class="Maybe">    1236:</span> 
<a name="1237" /><span class="Maybe">    1237:</span> <span class="k">/*</span>
<a name="1238" /><span class="Maybe">    1238:</span> <span class="k"> * If it is possible to have holes within a MAX_ORDER_NR_PAGES, then we</span>
<a name="1239" /><span class="Maybe">    1239:</span> <span class="k"> * need to check pfn validility within that MAX_ORDER_NR_PAGES block.</span>
<a name="1240" /><span class="Maybe">    1240:</span> <span class="k"> * pfn_valid_within() should be used in this case; we optimise this away</span>
<a name="1241" /><span class="Maybe">    1241:</span> <span class="k"> * when we have no holes within a MAX_ORDER_NR_PAGES block.</span>
<a name="1242" /><span class="Maybe">    1242:</span> <span class="k"> */</span>
<a name="1243" /><span class="False">    1243:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_HOLES_IN_ZONE</span>
<a name="1244" /><span class="False">    1244:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cGZuX3ZhbGlkX3dpdGhpbl8w"><span class="b">pfn_valid_within</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span> <span class="b">pfn_valid</span><span class="f">(</span><span class="b">pfn</span><span class="f">)</span>
<a name="1245" /><span class="Maybe">    1245:</span> <span class="f">#</span><span class="n">else</span>
<a name="1246" /><span class="Maybe">    1246:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cGZuX3ZhbGlkX3dpdGhpbl8w"><span class="b">pfn_valid_within</span></a><span class="f">(</span><span class="b">pfn</span><span class="f">)</span> <span class="f">(</span><span class="c">1</span><span class="f">)</span>
<a name="1247" /><span class="Maybe">    1247:</span> <span class="f">#</span><span class="n">endif</span>
<a name="1248" /><span class="Maybe">    1248:</span> 
<a name="1249" /><span class="False">    1249:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">CONFIG_ARCH_HAS_HOLES_MEMORYMODEL</span>
<a name="1250" /><span class="False">    1250:</span> <span class="k">/*</span>
<a name="1251" /><span class="False">    1251:</span> <span class="k"> * pfn_valid() is meant to be able to tell if a given PFN has valid memmap</span>
<a name="1252" /><span class="False">    1252:</span> <span class="k"> * associated with it or not. In FLATMEM, it is expected that holes always</span>
<a name="1253" /><span class="False">    1253:</span> <span class="k"> * have valid memmap as long as there is valid PFNs either side of the hole.</span>
<a name="1254" /><span class="False">    1254:</span> <span class="k"> * In SPARSEMEM, it is assumed that a valid section has a memmap for the</span>
<a name="1255" /><span class="False">    1255:</span> <span class="k"> * entire section.</span>
<a name="1256" /><span class="False">    1256:</span> <span class="k"> *</span>
<a name="1257" /><span class="False">    1257:</span> <span class="k"> * However, an ARM, and maybe other embedded architectures in the future</span>
<a name="1258" /><span class="False">    1258:</span> <span class="k"> * free memmap backing holes to save memory on the assumption the memmap is</span>
<a name="1259" /><span class="False">    1259:</span> <span class="k"> * never used. The page_zone linkages are then broken even though pfn_valid()</span>
<a name="1260" /><span class="False">    1260:</span> <span class="k"> * returns true. A walker of the full memmap must then do this additional</span>
<a name="1261" /><span class="False">    1261:</span> <span class="k"> * check to ensure the memmap they are looking at is sane by making sure</span>
<a name="1262" /><span class="False">    1262:</span> <span class="k"> * the zone and PFN linkages are still valid. This is expensive, but walkers</span>
<a name="1263" /><span class="False">    1263:</span> <span class="k"> * of the full memmap are extremely rare.</span>
<a name="1264" /><span class="False">    1264:</span> <span class="k"> */</span>
<a name="1265" /><span class="False">    1265:</span> <span class="m">int</span> <span class="b">memmap_valid_within</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">pfn</span><span class="f">,</span>
<a name="1266" /><span class="False">    1266:</span>                     <span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="b">page</span><span class="f">,</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span><span class="f">;</span>
<a name="1267" /><span class="Maybe">    1267:</span> <span class="f">#</span><span class="n">else</span>
<a name="1268" /><span class="Maybe">    1268:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">memmap_valid_within</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">pfn</span><span class="f">,</span>
<a name="1269" /><span class="Maybe">    1269:</span>                     <span class="m">struct</span> <span class="b">page</span> <span class="f">*</span><span class="b">page</span><span class="f">,</span> <span class="m">struct</span> <span class="b">zone</span> <span class="f">*</span><span class="b">zone</span><span class="f">)</span>
<a name="1270" /><span class="Maybe">    1270:</span> <span class="f">{</span>
<a name="1271" /><span class="Maybe">    1271:</span>     <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="1272" /><span class="Maybe">    1272:</span> <span class="f">}</span>
<a name="1273" /><span class="Maybe">    1273:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */</span>
<a name="1274" /><span class="Maybe">    1274:</span> 
<a name="1275" /><span class="Maybe">    1275:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !__GENERATING_BOUNDS.H */</span>
<a name="1276" /><span class="Maybe">    1276:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !__ASSEMBLY__ */</span>
<a name="1277" /><span class="True">    1277:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_MMZONE_H */</span>
<a name="1278" /><span class="True">    1278:</span> </pre>
  </body>
</html>
